go语言接口的基本概念
接口的基本概念
接口声明
- 使用接口字面量的场景非常少,一般只有空接口interface{}类型的变量的声明才会使用
- 接口支持嵌套接口
接口字面量类型的声明语法
interface {
MethodSignature1
MethodSignature2
}
接口命名类型使用type关键字声明语法
type InterfaceName interface{
MethodSignature1
MethodSignature2
}
方法声明
Go语言中的函数没有使用“函数声明”,类型的方法本质上就是函数的一种特殊的形式。我们提到了“方法声明”的概念,而不是方法签名。这里有必要澄清一下这两个概念:严格意义上的函数签名是函数的字面量类型,函数签名是不包括函数名的,而函数声明是指带上函数名的函数签名,同理,对于方法也是一样,接口定义使用方法声明,而不是方法签名,因为方法名是接口的组成成分
声明接口类型的特点
- 接口的命名一般以er结尾
- 接口定义的内部方法声明不需要func引导
- 在接口定义中,只有方法声明没有方法实现
接口初始化
- 没有初始化的接口变量,其默认值是nil
- 接口绑定具体类型的实例的过程叫做接口初始化
接口方法调用
package main
type Printer interface {
print()
}
type S struct{}
//定义方法,实现接口
func (s S) print() {
println("print")
}
func main() {
var i Printer
//没有初始化的接口调用其方法会产生panic
i = S{}
i.print()
}
接口的动态类型和静态类型
- 接口绑定的具体实例类型称为接口的动态类型
- 接口被定义时,其类型就已经被确定了,这个类型叫做接口的静态类型
- 静态类型的本质特征就是接口的方法签名集合,两个接口如果方法签名集合相同,则这两个接口在语义上完全等价,他们之间不需要强制类型转换就可以相互赋值
接口运算
- 类型断言
- 接口类型查询
类型断言
接口类型断言的语法形式如下:
i.(TypeName)
i必须是接口变量,TypeName可以是接口类型名,也可以是具体类型名
接口断言的两层语义
- 如果TypeName是一个具体类型名,则类型断言用于判断接口变量i绑定的实例类型是否就是具体类型TypeName
- 如果TypeName是一个接口类型名,则类型断言用于判断接口变量i绑定的实例类型是否同时实现了TypeName接口
接口断言的两种语法表现
- 直接赋值模式:o := i.(TypeName)
- comma,ok 模式
if o, ok := i . (TypeName) ; ok {
//ok的值为ture or false
//o为类型
}
类型查询
接口查询的语法格式如下:
switch v := i . (type) {
case type1 :
xxx
case type2 :
xxx
default:
xxx
}
接口查询有两层语义:一是查询一个接口变量底层绑定的底层变量的具体类型是什么,二是查询接口变量绑定的底层变量是否还实现了其他接口
- i必须是接口类型
- case字句后面可以跟非接口类型名,也可以跟接口类型名,匹配是按照case字句的顺序进行
- fallthrough语句不能再type switch语句中使用
空接口
没有任何方法的接口称之为空接口,空接口表示为interface{ },空接口内部封装了指针
空接口的用途:
- 空接口和泛型
go语言没有泛型,如果一个函数需要接受任意类型的参数,则参数类型可以使用空接口类型,这是弥补了没有泛型的一种手段
- 空接口和反射
空接口是反射实现的基础,反射库就是将相关具体的类型转换并赋值给空接口后才去处理
空接口和nil
到此这篇关于“go语言接口的基本概念”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!空接口不是真的为空,接口有类型和值两个概念
您可能感兴趣的文章:
想系统学习GO语言(Golang
go run main.go 参数_Go语言入门:Hello world
Go语言发展历史、核心、特性及学习路线
Go语言的主要特性和发展影响
go语言接口的基本概念
go语言核心编程_Go语言核心编程李文塔
浅谈golang中的接口
关于Golang的那些事(六) -- 接口
【Go语言入门系列】(八)Go语言是不是面向对象语言?
go 获取函数地址_Go语言基础--接口浅析