Golang中的接口(Interface)
1、定义
golang中的接口是一种抽象数据类型,定义了对象的行为规范,只定义规范不实现,实现由具体的对象来操作。interface是一组函数method的集合,接口不能包含任何变量。
2、空接口
golang中接口可以不定义任何方法,没有定义任何方法的接口叫做空接口。
①空接口表示没有任何约束,任何类型变量都可以实现空接口。
//声明一个空接口(当作类型使用)
var b interface{}
b = 20
fmt.Printf("b值:%v, 类型:%T\n", b, b) //b值:20, 类型:int
b = "over"
fmt.Printf("b值:%v, 类型:%T\n", b, b) //b值:over, 类型:string
b = false
fmt.Printf("b值:%v, 类型:%T\n", b, b) //b值:false, 类型:bool
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
②map的值实现空接口
//map的值实现空接口
var m1 = make(map[string]interface{})
m1["username"] = "Jack"
m1["age"] = 26
fmt.Println(m1) //map[age:26 username:Jack]
1
2
3
4
5
2
3
4
5
③slice的值实现空接口
//slice的值实现空接口
var s1 = make([]interface{}, 0, 10)
s1 = append(s1, "hello world")
s1 = append(s1, 20)
s1 = append(s1, false)
fmt.Println(s1) //[hello world 20 false]
1
2
3
4
5
6
2
3
4
5
6
④若空接口中存有切片/结构体,则无法用切片/结构体的方式定位读取到数据。
解决办法:类型断言(见3)
type Address struct{
Province string
City string
}
func main{
var userinfo = make(map[string]interface)
userinfo["username"] = "zhangsan"
userinfo["age"] = 20
userinfo["hobby"] = []string{"睡觉","吃饭"}
var address = Address{
Province:"fujian",
City:"fuzhou",
}
userinfo["address"] = address
fmt.Println(userinfo["username"]) //zhangsan
fmt.Println(userinfo["age"]) //20
fmt.Println(userinfo["hobby"]) [睡觉 吃饭]
fmt.Println(userinfo["hobby"][1]) //报错! 空指针不支持索引!
fmt.Println(userinfo["address"]) {fujian fuzhou}
fmt.Println(userinfo["address"].Province) //报错!无法获取空接口下的属性
//解决办法
hobby , _ := userinfo["hobby"].([]string)
fmt.Println(hobby[1]) //吃饭
address1, _ := userinfo["address"].(Address)
fmt.Println(address1.Province) //fujian
}
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
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
3、类型断言
一个接口的值(简称接口值)是由一个具体类型和具体类型的值两个部分组成。这两个部分分别称为接口的动态类型和动态值。
//语法格式
x.(T)
//x : 表示类型为interface{}的变量
//T : 表示断言x可能是的类型
1
2
3
4
2
3
4
注意:此方法只能结合switch语句使用
4、结构体值接收者和指针接收者实现接口的区别
结构体值接收者:如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给给接口类型变量
结构体指针接收者:如果结构体中的方法是指针接收者,那么实例化后的只有结构体指针类型可以赋值给给接口类型变量
编辑 (opens new window)