Go开发工程师
未来3-5年企业高性能项目不可替代的语言,从基础到项目实战再到重构,真正从入门到精通
我们在讲接口的时候说过,如果一个数据类型所拥有的方法集合中包含了某一个接口类型中的所有方法声明的实现,那么就可以说这个数据类型实现了那个接口类型。要获知一个数据类型都包含哪些方法并不难。但是要注意指针方法与值方法的区别。
拥有指针方法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并发编程实战》中的相关章节。
在源码文件的第10行处加入若干代码,使该文件不出现任何编译错误,并且运行该文件会使标准输出上出现true, true
。
在该文件第10行添加的代码可以是:
type Dog struct { name string age uint8 } func (dog Dog) Name() string { return dog.name } func (dog Dog) Age() uint8 { return dog.age }
注意,答案并不唯一。
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报