关于方法绑定的一个问题
上面代码中 func Increase绑定在了 *TZ类型上,那么为什么主函数里面定义的是个TZ类型,如果把
var a TZ 换成 var a *TZ
程序运行反而报错,为什么?
回答:
var a *TZ
只是声明了一个指向TZ类型的空指针,如果直接调用a.Increase(100)
程序可以编译,但是运行时会报错,因为你在Increase方面里做了dereference的操作:*tz
。
正确做法应该是和geidoo所说的先赋值:a = new(TZ)
。
var a *TZ,这个语句本来就是错的。
@geidoo 这个说法不正确,这个声明是合法的,只是题主没有做空指针初始化而已。
回答:
这也是个老问题了,感觉每个学go的人都会遇到。其实对于这种绑定类型的方法,你就可以理解成这个类型也是函数的一个参数。假如函数里面需要对这个类型作修改,那就必须声明成指针了,因为函数是值传递的,不声明成指针,那么修改只是发生在该类型的一份副本上。
具体可以参考官方的FAQ
但不管怎么说,个人不喜欢go的这种表达方法,因为不直观迷惑人
以上是 关于方法绑定的一个问题 的全部内容, 来源链接: utcz.com/p/183148.html