接口类型使自身也是一种结构类型,但是编译器对其做了一些限制。
type iface struct{
tab *itab //类型信息
data unsafe.Pointer //实际对象指针
}
编译器是根据方法集来判断是否实现了接口,请看下面试例
如何查询当前结构体的方法集?
func methodSet(a interface{}) {
t := reflect.TypeOf(a)
for i, n := 0, t.NumMethod(); i < n; i++ {
m := t.Method(i)
fmt.Println(m.Name)
}
}
请看下面典型的实现接口的实例
package main
import (
"fmt"
)
type tester interface {
test()
string() string
}
type user struct{}
func (*user) test() {}
func (user) string() string {
return "hello world"
}
func main() {
var d user
//var t tester = d // user does not implement tester
var t tester = &d
t.test()
fmt.Println(t.string())
}