Go interface

接口 interface

接口是一个或多个方法签名的集合,只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明了实现了哪个接口,这称为 Structural Typing

接口只有方法声明,没有实现,没有数据类型

接口可以匿名嵌入其他接口,或嵌入结构中

将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态 ,也无法获取指针

只有当接口存储的类型和对象都为 nil 时,接口才等于 nil

接口调用不会做 receiver 的自动转换

接口同样支持匿名字段方法

接口可实现类型 OOP 中的多态

空接口可以作为任何类型数据的容器

接口定义与基本操作

接口是一个或多个方法签名的集合,只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明了实现了哪个接口,这称为 Structural Typing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type USB interface {
Name() string
Connect()
}

type PhoneConnector struct {
name string
}

func (pc PhoneConnector) Name() string {
return pc.name
}

func (pc PhoneConnector) Connect() {
fmt.Println("Connect:", pc.name)
}

func main() {
var a USB
a = PhoneConnector{"huawei"}
a.Connect()
}

输出

1
Connect: huawei

PhoneConnector拥有USB接口所有的方法,即实现了该接口

符合该interface的方法

1
2
3
4
5
6
7
8
func Disconnect(usb USB) {
fmt.Println("Disconnected.")
}

func main(){
... 省略
Disconnect(a)
}

输出

1
Disconnected.

嵌入接口

一个接口中包含另一个接口

1
2
3
4
5
6
7
8
type USB interface {
Name() string
Connector
}

type Connector interface {
Connect()
}

类型断言

interface.(struct)

1
2
3
4
5
6
7
func Disconnect(usb USB) {
if pc, ok := usb.(PhoneConnector); ok {
fmt.Println("DisConnected.", pc.name)
return
}
fmt.Println("Unknown dec.")
}

空接口与 type switch

1
2
// 空接口
type empty interface {}

意味着在Go中所有的类型都实现空接口

1
2
- func Disconnect(usb USB) {
+ func Disconnect(usb interface{}) {

空接口以为所有的类型都是可以进入,如果要判断某一类型时,使用type switch进行处理:

1
2
3
4
5
6
7
8
func Disconnect(usb interface{}) {
switch v := usb.(type) {
case PhoneConnector:
fmt.Println("Disconnected", v.name)
default:
fmt.Println("Unknown dec.")
}
}

接口转换

由基础往下进行转换

1
2
3
4
pc := PhoneConnector{"phone"}
var a Connector
a = Connector(pc)
a.Connect()

接口使用注意事项

将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态 ,也无法获取指针

1
2
3
4
5
6
7
8
9
func main() {
pc := PhoneConnector{"phone"}
var a Connector
a = Connector(pc)
a.Connect()

pc.name = "pc"
a.Connect()
}

输出

1
2
Connect: phone
Connect: phone

只有值拷贝

- the End -
0%