接口的隐式和显式
2022年7月18日
Go 隐式接口的特点
- 只要实现了接口的全部方法,就是自动实现接口
- 可以在不修改代码的情况下抽象出新的接口
一个简单的接口示例
package main
import "fmt"
type Car interface {
	Driver()
}
type Truck struct {
	Model string
}
func (t Truck) Driver() {
	fmt.Println(t.Model)
}
func main() {
	var c Car = Truck{Model: "卡车类型"}
	fmt.Println(c)
}
一个接口的值的底层表示
type iface struct {
	tab  *itab
	data unsafe.Pointer
}
type itab struct {
	inter *interfacetype // 当前接口的类型
	_type *_type // 当前接口装饰的类型
	hash  uint32 // copy of _type.hash. Used for type switches.
	_     [4]byte
	fun   [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter. 实现了哪些方法
}
- 接口数据使用runtime.iface表示
- iface记录了数据的地址
- iface记录了接口的类型信息和实现的方法(可以用于类型断言)
类型断言
- 类型断言是一个使用在接口值上的操作
- 可以将接口值转换为其他类型值(实现或者兼容接口)
- 可以配合switch进行类型判断
func main() {
	var c Car = Truck{Model: "卡车类型"}
    // 使用类型断言进行转换类型
	t := c.(Truck)
	fmt.Println(c)
	fmt.Println(t)
}
Loading...
