接口 interface
接口是一个或多个方法签名的集合,只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明了实现了哪个接口,这称为 Structural Typing
接口只有方法声明,没有实现,没有数据类型
接口可以匿名嵌入其他接口,或嵌入结构中
将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态 ,也无法获取指针
只有当接口存储的类型和对象都为 nil 时,接口才等于 nil
接口调用不会做 receiver 的自动转换
接口同样支持匿名字段方法
接口可实现类型 OOP 中的多态
空接口可以作为任何类型数据的容器
接口定义与基本操作
接口是一个或多个方法签名的集合,只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明了实现了哪个接口,这称为 Structural Typing
1 | type USB interface { |
输出
1 | Connect: huawei |
PhoneConnector
拥有USB
接口所有的方法,即实现了该接口
符合该interface的方法
1 | func Disconnect(usb USB) { |
输出
1 | Disconnected. |
嵌入接口
一个接口中包含另一个接口
1 | type USB interface { |
类型断言
interface.(struct)
1 | func Disconnect(usb USB) { |
空接口与 type switch
1 | // 空接口 |
意味着在Go中所有的类型都实现空接口
1 | - func Disconnect(usb USB) { |
空接口以为所有的类型都是可以进入,如果要判断某一类型时,使用type switch
进行处理:
1 | func Disconnect(usb interface{}) { |
接口转换
由基础往下进行转换
1 | pc := PhoneConnector{"phone"} |
接口使用注意事项
将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态 ,也无法获取指针
1 | func main() { |
输出
1 | Connect: phone |
只有值拷贝