在Go语言中接口
interface
是一种类型,一种抽象的类型。
- 如何定义接口
interface
- 接口如何实现和使用
- 值接收者和指针接收者的区别
- 值接收者实现接口:类型的值和类型的指针接收者都可以保存在类型变量中
- 指针接收者实现接口:只能是指针接收者
- 空接口的应用
- 空接口的类型断言
x.(type)
接口定义
Go语言提倡面向接口编程,每个接口由数个方法组成,接口的格式如下:
1 | type interfaceName interface{ |
-
接口名:使用
type
关键字将接口定义为自定义的类型名。- 接口名字一般是
er
结尾 - 接口名字最好能够体现该接口的含义,比如写操作的接口Writer,字符串功能的接口Stringer
- 接口名字一般是
-
方法名:只要当方法名和接口类型名字是大写的时候,接口所在的包之外的代码能够进行访问。
记住:在go语言中首字母带包的类型才能够被外部访问
-
参数和返回值列表:可以省略不写
1 | // 栗子 |
接口实现
下面的栗子中dog、cat 、person
都实现了say()方法,因此在接口sayer
中只要是实现了say()
方法的都可以使用。
1 | package main |
值接收者和指针接收者
1 | package main |
类型和接口的关系
一个类型可以实现多个接口
多个类型也可以实现同一个接口
1 | package main |
空接口
空接口是指没有定义任何方法的接口,任何类型都可以实现空接口。
- 空接口类型的变量可以存储任意类型的变量
- 空接口实现接收任意类型的函数参数
- 空接口一般是不需要提前定义,使用的时候直接定义
1 | package main |
接口值
接口值是由一个具体类型
和具体类型的值
两部分组成,分别对应为接口的动态类型
和动态类型的值
。
如何判断空接口中类型的值:使用接口断言
1 | x.(T) |
- x:表示类型为interface{}的变量
- T:表示可能的类型
返回的结果中有两个值:
-
x转化为类型T后的变量
-
判断的结果,
bool
值:判断成功是T
,失败是F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30package main
import (
"fmt"
)
func main(){
var x interface{}
x = "xiaoming"
// 类型断言
ret, ok := x.(string) // 猜的类型不对,ok=false,ret=string类型的零值
if !ok{
fmt.Println("不是字符串类型")
}else{
fmt.Println("是字符串类型", ret)
}
// 使用switch进行类型断言
switch v:= x.(type) {
case string :
fmt.Printf("是字符串类型,value:%v\n", v)
case int:
fmt.Printf("是int类型,value:%v\n", v)
case bool:
fmt.Printf("是bool类型,value:%v\n", v)
default: // 最后必须要有默认的结果值
fmt.Printf("找不到合适类型")
}
}