5-12 gdb接口内部结构
type N int
func (N) A() { println("*N.A") }
func (*N) B() { println("*N.B") }
func (*N) C() { println("*N.C") } // *N = N + *N = A+B+C // N = A
type Ner interface {
A()
B()
}
func main() {
var n N = 0x100
var x Ner = &n // main.(*N)
x.A()
x.B()
}
定义类型N,N有三个方法,其中一个属于N的,两个属于N指针的,定义一个接口Ner,要求必须有两个方法A和B。因为Go语言并不需要明确的在类型上声明实现了某个接口,但是Java或者C#需要明确声明。
Go语言就是当方法集包含某个接口的全部声明就表示你实现了这个接口,我们通常把类型Ner叫做鸭子类型(Duck Type),就是你长的像这只鸭子我们就可以把你当做鸭子。类型N有A和B,那么就认为它实现了Ner接口。
main方法中首先创建了N的对象实例,接下来把这个实例赋值给接口对象,这地方为什么不直接用N而是用N指针呢?因为类型N包含A,N指针包含A、B、C,所以只有N指针实现了Ner接