6-5 Go语言-指针(续)
本节编程练习不计算学习进度,请电脑登录imooc.com操作

Go语言-指针(续)

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

任务

在源码文件的第10行处加入若干代码,使该文件不出现任何编译错误,并且运行该文件会使标准输出上出现true, true

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Pet interface {
  6. Name() string
  7. Age() uint8
  8. }
  9.  
  10.  
  11.  
  12. func main() {
  13. myDog := Dog{"Little D", 3}
  14. _, ok1 := interface{}(&myDog).(Pet)
  15. _, ok2 := interface{}(myDog).(Pet)
  16. fmt.Printf("%v, %v\n", ok1, ok2)
  17. }
下一节