Go_接口、多态、接口继承、空接口、类型断言

2023-11-20

接口

  • 接口是把所有具有共性的方法定义在一起,是方法集,任何类型实现了接口中所有的方法,就是实现了这个接口。
  • 接口可以实现多态
  • 接口传递的是地址值

接口定义及调用:

定义格式:

tepe 接口名 interface{
  方法名(参数) 返回值
}

调用格式1:

对象名.方法名

调用格式2:通过接口变量调用必须实现接口所有方法

var 变量名 接口名

结构体和结构体指针实现接口

type TestInterface interface {
	Hello()
}
func (s Student) Hello() {}  // 使用结构体实现接口
func (s *Student) Hello() {} // 使用结构体指针实现接口

只要结构体和接口中的方法名一样,就会认为这么结构体实现了这个接口的方法

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	//age int // 接口中不能有变量
	//Welcome()
	Hello()
}

type TestInterface2 interface {
	Hello2()
}

// 一个结构体可以实现多个接口
func (s *Student) Hello() {
	fmt.Println("Student实现了Hello方法")
}

func (s *Student) Hello2() {
	fmt.Println("Student实现了Hello2方法")
}

// 一个接口可以被多个结构体实现
func (t *Teacher) Hello() {
	fmt.Println("Teacher实现了Hello方法")
}

func main() {
	// 对象名.方法名
	var stu Student
	stu.Hello()
	var tea Teacher
	tea.Hello()

	// 通过接口变量调用,如果接口中有两个方法,但是只实现了一个,就会报错,必须全部实现
	var t TestInterface
	t = &stu
	t.Hello()
}

接口继承:

接口的继承和普通继承是一样的,直接写接口名就可以了,但是要实现继承接口的所有方法

func main() {
	var stu Student
	var t TestInterface02
	// 接口中的方法数据类型是指针类型就要使用取地址符,如果方法的类型不是指针就不用加
	t = &stu
	t.Hello() // 可以调用所继承接口中的方法
	t.HelloHello()

	var test TestInterface
	test = t
	test.Hello()
}

type Student struct{}

type TestInterface interface {
	Hello()
}

type TestInterface02 interface {
	TestInterface // 继承接口
	HelloHello()
}

func (student *Student) Hello() {
	fmt.Println("Hello")
}

func (student *Student) HelloHello() {
	fmt.Println("HelloHello")
}

空接口:

空接口不包含任何的方法,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值

func main() {
	// 定义空接口的切片,由于是空接口所以可以存储任意类型的数据
	var s []interface{}
	s = append(s, 1, 2, 3, "字符串", 1.1, true)
	fmt.Println(s)

	// map也可以使用接口
	m := make(map[string]interface{})
	m["打野"] = "韩信"
	m["金币"] = 50
	fmt.Println(m)
}

多态:

  • 多态是同一个接口,使用不同的实例执行不同的操作
  • 多态是除封装、继承之后面向对象的第三大特征。
  • 多态是出现在接口关系中的(只能是接口)

例:汽车和摩托车都属于车,但具有不同的功能

多态的实现:

func 函数名 (参数 接口类型){}

演示:

func main() {
	var stu Student
	var tea Teacher

	// 多态,要加取地址符,因为方法是指针类型
	Polymorphic(&stu) //Student类实现了接口的Hello方法
	Polymorphic(&tea) // Teacher类实现了接口的Hello方法
}

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	Hello()
}

func (student *Student) Hello() {
	fmt.Println("Student类实现了接口的Hello方法")
}

func (teacher *Teacher) Hello() {
	fmt.Println("Teacher类实现了接口的Hello方法")
}

func Polymorphic(p TestInterface) {
	p.Hello()
}

类型断言:

通过类型断言,可以判断空接口中存储的数据类型

定义格式:

value,ok:=m.(T)
  • value:表示变量m的值
  • ok:表示布尔类型变量,如果断言成功为true,否则为false
  • m:表示空接口类型的变量,如果推断成功就把数据赋值给value
  • T:表示断言的类型

演示:

func main() {
	var i interface{}
	i = 123

	// 如果i是int类型就会把结果赋值给ok,把数据(123)赋值给value
	value, ok := i.(int)
	if ok {
		fmt.Println("断言成功:", value)
	} else {
		fmt.Println("断言失败")
	}
}

接口作为函数参数,断言也可以结合分支语句、循环语句

func main() {
	var i interface{}
	i = false
	Test(i)
}

func Test(i interface{}) {
	switch i.(type) {
	case int:
		fmt.Println("是int类型")
	case bool:
		fmt.Println("是bool类型")
	case string:
		fmt.Println("是string类型")
	default:
		fmt.Println("啥也不是")
	}
}

计算器案例:

func main() {
	var c ObjectInitialization
	result := c.Create("+", 1, 2)
	fmt.Println(result)
}

// 接口
type Calculate interface {
	GetResult() int
}

// 公共参数类
type Num struct {
	num1, num2 int
}

// 加法类
type Add struct {
	Num
}

func (add *Add) GetResult() int {
	return add.num1 + add.num2
}

// 减法类
type Sub struct {
	Num
}

func (sub *Sub) GetResult() int {
	return sub.num1 - sub.num2
}

// 乘法类
type Multiplication struct {
	Num
}

func (multiplication *Multiplication) GetResult() int {
	return multiplication.num1 * multiplication.num2
}

// 除法类
type DivisionMethod struct {
	Num
}

func (divisionMethod *DivisionMethod) GetResult() int {
	return divisionMethod.num1 / divisionMethod.num2
}

// 用于完成选择哪个方法的调用
type ObjectInitialization struct{}

func InvokingFunction(c Calculate) int {
	return c.GetResult()
}
func (o *ObjectInitialization) Create(oi string, num1, num2 int) int {
	switch oi {
	case "+":
		add := Add{Num{num1, num2}}
		return InvokingFunction(&add)
	case "-":
		sub := Sub{Num{num1, num2}}
		return InvokingFunction(&sub)
	default:
		return 0
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go_接口、多态、接口继承、空接口、类型断言 的相关文章

  • 七. go 常见数据结构实现原理之 反射

    目录 一 golang 是如何实现反射的 如何比较两个对象完全相等 一 golang 是如何实现反射的 参考博客Go 语言问题集 Go Questions Go 语言在 reflect 包里定义了各种类型 实现了反射的各种函数 通过它们可以
  • golang基础教程

    目录 golang基础教程 一 环境搭建 golang基础教程 二 开发规范及API golang基础教程 三 变量与数据类型概述 golang基础教程 四 基本数据类型 golang基础教程 五 基本数据类型的转换 golang基础教程
  • Go_关键字、编译、转义字符

    关键字 关键字是指被go语言赋予了特殊含义的单词 共25个 关键字不能用于自定义名字 只能在特定语法结构中使用 break default func interface select case defer go map struct cha
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • go 进阶 go-zero相关: 七. 拦截器与熔断拦截器

    目录 一 拦截器的基础使用 1 服务端拦截器 2 客户端拦截器 二 拦截器底层底层执行原理 三 go zero默认添加的拦截器 客户端 1 熔断器拦截器 BreakerInterceptor 服务端 一 拦截器的基础使用 在go zero
  • go 进阶 gin实战相关: 五. gin_scaffold 企业脚手架

    目录 一 gin scaffold 企业级脚手架 二 gin scaffold 脚手架安装及使用演示 文件分层解释 开始使用 1 配置开启go mod 功能 2 下载 安装 gin scaffold 3 整合 golang common 4
  • Go语言包管理(一)

    Go语言中的包 我们在使用其他语言 比如Java Python 都有类似包的概念 Go也不例外 其核心思想即为分组和模块化 人的大脑对庞大和复杂的事情很难掌控 可以对其采用分而治之的策略 使其模块化 从而更容易管理 如下是标准库中net包的
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • Go_接口、多态、接口继承、空接口、类型断言

    接口 接口是把所有具有共性的方法定义在一起 是方法集 任何类型实现了接口中所有的方法 就是实现了这个接口 接口可以实现多态 接口传递的是地址值 接口定义及调用 定义格式 tepe 接口名 interface 方法名 参数 返回值 调用格式1
  • Go 语言输出文本函数详解

    Go语言拥有三个用于输出文本的函数 Print Println Printf Print 函数以其默认格式打印其参数 示例 打印 i 和 j 的值 package main import fmt func main var i j stri
  • 有哪些不错的 Golang 开源项目?

    目前人在字节做 Go 开发 寻找 Golang 开源项目学习目的可能是 想学习或者提高自己对 Go 项目的组织和编排能力 想学习 Go 项目的框架设计 想在一些 Go 语法上细节的优化和进阶 我推荐两个项目 一 tinode 这是一个开源的
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成
  • 【go语言开发】Minio基本使用,包括环境搭建,接口封装和代码测试

    本文主要介绍go语言使用Minio对象存储 首先介绍搭建minio 创建bucket等 然后讲解封装minio客户端接口 包括但不限于 上传文件 下载 获取对象url 最后测试开发的接口 文章目录 前言 Minio docker安装mini
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • go-zero开发入门之网关往rpc服务传递数据1

    go zero 的网关往 rpc 服务传递数据时 可以使用 headers 但需要注意前缀规则 否则会发现数据传递不过去 或者对方取不到数据 go zero 的网关对服务的调用使用了第三方库 grpcurl 入口函数为 InvokeRPC
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • Go 语言中切片的使用和理解

    切片与数组类似 但更强大和灵活 与数组一样 切片也用于在单个变量中存储相同类型的多个值 然而 与数组不同的是 切片的长度可以根据需要增长和缩小 在 Go 中 有几种创建切片的方法 使用 datatype values 格式 从数组创建切片
  • go开发--操作mysql数据库

    在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动 Go 中常用的 MySQL 驱动有 github com go sql driver mysql 和 github com go xorm xorm
  • Go、Docker、云原生学习笔记全攻略:从零开始,一步步走向精通!(2024版)

    第一章 Go语言学习宝典 一 介绍 01 Go 语言的前生今世 二 开发环境搭建 01 Go 语言开发环境搭建 三 初识GO语言 01 Go 多版本管理工具 02 第一个 Go 程序 hello world 与 main 函数 03 Go

随机推荐

  • linux入门系列20--Web服务之LNMP架构实战

    作为本入门系列最后一篇文章 将演示如何在CentOS7环境下搭建LNMP环境来构建个人博客网站 常见搭建网站的方式有LAMP LNMP IIS Nginx Tomcat等等 本文演示比较流行的基于LNMP方式来搭建动态WEB网站 正如前文
  • VScode配置C++(win11)以及Vscode的一些使用问题

    目录 一 下载VScode 省略 二 下载编译器 mingw 三 配置 vscode 四 补充 配置好后 输出中文会乱码 五 文件参数讲解 六 多文件编译 修改task json 七 中文问题 一 下载VScode 省略 二 下载编译器 m
  • 测试设计提升之路

    当前软件行业中有很多职位 其中开发与测试可以说是TOP2热门 测试相对开发来说入门容易 但要快速达到巅峰 我们需要掌握一些方法与套路 测试工作是一个繁琐的工作 一个人的精气神有限 在规定的时间内需要掌握多种技术 而且要达到精通非常困难 就测
  • java 使用匿名内部类的方式创建线程并设置和获取线程名字

    有些方法需要传入接口的实例或者抽象类的实例对象 比如Thread有一个构造方法 Thread Runnable target 这时可以可以自定义类实现Runnable接口 重写接口中的方法 将自定义类的对象传入构造方法中 也可以使用匿名内部
  • K8S学习--Kubeadm-7--Ansible二进制部署

    K8S学习 Kubeadm 安装 kubernetes 1 组件简介 K8S学习 Kubeadm 安装 kubernetes 2 安装部署 K8S学习 Kubeadm 3 dashboard部署和升级 K8S学习 Kubeadm 4 测试运
  • C++ 智能指针详解

    点击蓝字 关注我们 参考资料 C Primer中文版 第五版 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • 第6天-[21天学Python]-面向对象编程以及类的属性和方法

    本章的主要内容有 对象概述 类与对象 定义与使用类 类的属性与方法 类的继承 类的方法重载 1 面向对象编程 1 1 万物皆对象 程序对现实中的事物进行有目的的抽象 面向对象编程就是通过面向对象分析与设计 建立模型 类或对象 并完成最终程序
  • java代码上传本地图片返回地址

    有时候我也很迷这个到底是怎么上传的 写这篇为了给自己看的 大家可参照 Value constantvalue uploadPath private String uploadPath Value constantvalue hostname
  • 极大似然估计详解

    极大似然估计 以前多次接触过极大似然估计 但一直都不太明白到底什么原理 最近在看贝叶斯分类 对极大似然估计有了新的认识 总结如下 贝叶斯决策 首先来看贝叶斯分类 我们都知道经典的贝叶斯公式 其中 p w 为先验概率 表示每种类别分布的概率
  • 【源码+文档】爬虫检索系统

    实验内容 从Top250电影榜单上爬取所有电影的相关信息 包括影片海报 影片海报链接 影片中外文名 影片评分 影片评价人数 影片概况 影片缩略信息 例如 导演 部分演员 上映时间 电影类型等等 将海报以 jpg形式 将其他信息以excel文
  • 游戏币java_Java实现蓝桥杯分金币

    分金币 圆桌旁坐着n个人 每人有一定数量的金币 金币总数能被n整除 每个人可以给他左右相邻的人一些金币 最终使得每个人的金币数目相等 你的任务是求出被转手的金币数量的最小值 比如 n 4 且4个人的金币数量分别为1 2 5 4时 只需转移4
  • 【Antlr】ANTLR语法规则

    1 概述 ANTLR语法规则的主要工作是定义词法解析规则和语法解析规则 ANTLR约定词法解析规则以大写字母开头 语法解析规则以小写字母开头 下面简单介绍一下ANTLR的规则 首先需要定义Grammar类型及名称 名称必须和文件名一样 有L
  • 每日一题 337. 打家劫舍 III

    难度 中等 整体思路相当于是前两天的方法倒过来 毕竟二叉树最常用的解法就是递归倒推 对于每一颗子树 他必定有一种最大的盗取方法 但是只有它的 root 的盗取情况才会影响到 root 的父节点 即如果收益最大的盗取方法中不盗取 root 那
  • anaconda 2023.3 win10 安装,镜像配置,存储路径更改超详细教程

    现在 ai 很火 做 ai 开发 离不开 python anaconda 是 python 开发的重要工具 这里介绍一下 anaconda 最新版的 2023 3 在 win10 的安装 镜像配置 以及虚拟环境存储路径的更改 1 anaco
  • (48.4)【WAF绕过】SQL注入、文件上传、XSS

    目录 一 SQL注入绕过 二 文件上传绕过 三 xss绕过 一 SQL注入绕过 WAF绕过基础分析和原理 注入绕过WAF方法分析https blog csdn net qq 53079406 article details 12314769
  • 深度学习2015年文章整理(CVPR2015)

    国内外从事计算机视觉和图像处理相关领域的著名学者都以在三大顶级会议 ICCV CVPR和ECCV 上发表论文为荣 其影响力远胜于一般SCI期刊论文 这三大顶级学术会议论文也引领着未来的研究趋势 CVPR是主要的计算机视觉会议 可以把它看作是
  • 【JavaWeb】 练习二

    1 gt 实现登录 如果用户名密码错误 转入到登录页面 提示信息 用户名密码错误 2 gt 如果用户不登录 直接访问展示页面 也需要转入到登录页面 提示信息 请先登录在访问 3 gt 实现退出功能 转到登录页面 4 gt 统计查看展示页面的
  • 必杀VI、VIM编辑器命令

    题记 VI和VIM有非常多的命令 在此分部分展示一下 第一部分 一 移动光标类 一般模式 光标移动 复制粘贴 查找替换 上下移动 h lt 光标向左移动一个字符 j 向上箭头 光标向上移动一个字符 k 向下箭头 光标向下移动一个字符 l 向
  • Go_接口、多态、接口继承、空接口、类型断言

    接口 接口是把所有具有共性的方法定义在一起 是方法集 任何类型实现了接口中所有的方法 就是实现了这个接口 接口可以实现多态 接口传递的是地址值 接口定义及调用 定义格式 tepe 接口名 interface 方法名 参数 返回值 调用格式1