interface
interface 是方法签名的一个集合形如以下
type Dog interface{
Wang()
WangWang()
}
实现interface
如果一个类型 包含所有的接口的方法(参数,返回值都一样),就可以说这个类型实现了这个接口
一个你不知道的坑
请仔细对比以下两个代码
如果你不知道为什么请继续往下看
知其然知其所以然
- 为什么会出现上面这种状况呢,
- 在go中其实对于一个类型T ,它的方法集合是
所有的以T为receiver声明的方法
。对于类型*T,它的方法集合是所有T或者*T为receiver声明的方法
,所以对于PlayGround1类型并没有实现接口中的方法,而我们平时为什么又可以直接通过非指针类型实例调用指针接收器方法呢,这是因为编译器为了方便我们编码给我们做了转换。 简单点来说:
下面代码中 dog实例并不包含 Dog接收器的Sleep方法!,但是如果dog是Dog类型的话,它既包含*Dog接收器的方法,又包含Dog接收器的方法!这是语言的实现!想了解更过请看参考资料
package main
import "fmt"
type Dog struct {
}
func (d *Dog) Sleep(){
fmt.Println("sleep")
}
func main(){
var dog Dog
dog.Sleep() //17行
}
// go tool compile -N -l -S file.go > file.S (file是你要获取汇编代码的文件名),然后通过行号就可以对应到每一行汇编代码
0x001d 00029 (test3.go:17) LEAQ "".dog+8(SP), AX
0x0022 00034 (test3.go:17) PCDATA $0, $0
0x0022 00034 (test3.go:17) MOVQ AX, (SP)
0x0026 00038 (test3.go:17) CALL "".(*Dog).Sleep(SB)
0x002b 00043 (test3.go:18) MOVQ 8(SP), BP
0x0030 00048 (test3.go:18) ADDQ $16, SP