一般不会需要指向接口的指针,应该将接口作为值传递:底层的数据,仍然可以是指针。
一个接口的内部实现,有两个指针类型字段:
//src/runtime/runtime2.go
type iface struct {
tab *itab
data unsafe.Pointer
}
- itab:用来存放接口自身类型和绑定的实例类型及实例相关的函数指针。
- 数据指针data:指向接口绑定的实例的副本,接口的初始化也是一种值拷贝。data指向具体的实例数据,如果传递给接口的是值类型,则data指向的是实例的副本。如果传递给接口的是指针类型,则data指向指针的副本。
- 无论接口的转换,还是函数调用,Go遵循一样的规则:值传递