GO接口赋值与方法接收者问题
2018-07-09 23:37
155 查看
这篇博客是受到GO语言中文网论坛中问题启发所写,原链接在此https://studygolang.com/topics/5946
其中第一个回复为博主
有代码如下:
package main import "fmt" type TestStruct struct { id int name string } type AnotherTestStruct struct { id int name string } type ITest interface { SayHello() } func main() { var itest ITest test := TestStruct{id: 1, name: "test1"} test2 := AnotherTestStruct{id: 2, name: "anotherTest"} itest = test // OK itest.SayHello() // test1 itest = &test // OK itest.SayHello() // test1 itest = test2 // cannot use test2 (type AnotherTestStruct) as type ITest in assignment: // AnotherTestStruct does not implement ITest (SayHello method has pointer receiver) itest.SayHello() itest = &test2 // OK itest.SayHello() // anotherTest } func (test TestStruct) SayHello() { fmt.Println(test.name) } func (test *AnotherTestStruct) SayHello() { fmt.Println(test.name) }其实这里是GO的一种简略的写法,以值为接收者的方法被调用时,接收者既能为值又能为指针。但是以指针为接收者的方法,接收者就只能是指针了。所以&test2作为指针,实现了SayHello方法,所以可以将&test2赋值给itest,而test2作为AnotherTestStruct类型,未实现SayHello方法,不能将其赋值给itest。而&test也可以作为func (test TestStruct) SayHello()方法的接收者,即实现了SayHello方法,所以可以赋值给itest。
至于原因的话,我个人理解是类似传引用与传值的区别,当定义接收者为指针时,相当于是传引用调用,所以必须用指针作为接收者。如果接收者不是指针的话,则即可以利用传值也可以利用传引用,所以上述例子中itest = &test, itest.SayHello()的时候会被解释为(*itest).SayHello()。
如果有不同见解,欢迎讨论指正。
阅读更多
相关文章推荐
- sqlite3 jdbc、c接口、python接口处理中文时遇到的问题及其解决方法
- 在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。
- N7系统VC6中添加OCX出现“不支持此接口” 问题的解决方法
- WIN7系统VC6中添加OCX出现“不支持此接口” 问题的解决方法
- java中的继承问题,类B继承A,那么构造方法需要这样写吗?这不是重复吗?还有接口与抽象类怎么实现?
- JAVA_解决实现接口方法重名问题
- VS2003自定义封送拆收器不实现ICustomMarshaler接口问题的解决方法
- 解决android程序中oncreate方法中调用百度地图MKSearchListener接口不执行的问题
- 解决Android中调用百度地图MKSearchListener接口回调方法不执行的问题
- GO同包内不同文件方法引用问题
- 简单的java实验,涉及到 类继承以及接口问题,方法体的重写(区别于重载)
- java中抽象类与接口中方法访问修饰符问题
- 关于接口使用getType的方法的问题
- dll动态链接库之用类写配置文件和调用判断方法接口的实现中遇到的若干问题
- PHP多个接口同个方法的问题
- 解决方法:SQL2008 链接服务器 访问接口 "SQLNCLI10" 的架构行集 出错的问题!
- 在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。
- java中抽象类与接口中方法访问修饰符问题
- sqlite3 jdbc、c接口、python接口处理中文时遇到的问题及其解决方法
- C++学习:Calc的赋值问题解决了,解决方法:先刷新控件值至相应变量