咱们在讲接口的时候说过,若是一个数据类型所拥有的方法集合中包含了某一个接口类型中的全部方法声明的实现,那么就能够说这个数据类型实现了那个接口类型。要获知一个数据类型都包含哪些方法并不难。可是要注意指针方法与值方法的区别。
拥有指针方法Grow
和Move
的指针类型*Person
是接口类型Animal
的实现类型,可是它的基底类型Person
却不是。这样的表象隐藏着另外一条规则:一个指针类型拥有以它以及以它的基底类型为接收者类型的全部方法,而它的基底类型却只拥有以它自己为接收者类型的方法。
以上一小节练习题中的类型MyInt
为例,若是Increase
方法是它的指针方法且Decrease
方法是它的值方法,那么*MyInt
类型会拥有这两个方法,而MyInt
类型仅拥有Decrease
方法。再以Person
类型为例。即便咱们把Grow
和Move
都改成值方法,*Person
类型也仍会是Animal
接口的实现类型。另外一方面,Grow
和Move
中只要有一个是指针方法,Person
类型就不多是Animal
接口的实现类型。
另外,还有一点须要你们注意,咱们在基底类型的值上仍然能够调用它的指针方法。例如,若咱们有一个Person
类型的变量bp
,则调用表达式bp.Grow()
是合法的。这是由于,若是Go语言发现咱们调用的Grow
方法是bp
的指针方法,那么它会把该调用表达式视为(&bp).Grow()
。实际上,这时的bp.Grow()
是(&bp).Grow()
的速记法。
在Go语言中,与指针有关的操做实际上还有更多。咱们也能够依据这些操做玩儿出不少花样。不过就通常的Go语言编程而言,目前讲述的这些知识已经足够了。若是你们想深刻下去,能够参看Go语言官方文档和《Go并发编程实战》中的相关章节。编程