首页 > 关于方法绑定的一个问题

关于方法绑定的一个问题

上面代码中 func Increase绑定在了 *TZ类型上,那么为什么主函数里面定义的是个TZ类型,如果把
var a TZ 换成 var a *TZ
程序运行反而报错,为什么?


var a *TZ,这个语句本来就是错的。
按你的想法应该是这样写:

func main(){
    a:=new(TZ)
    a.Increase(100)
    println(*a)
}

这也是个老问题了,感觉每个学go的人都会遇到。其实对于这种绑定类型的方法,你就可以理解成这个类型也是函数的一个参数。假如函数里面需要对这个类型作修改,那就必须声明成指针了,因为函数是值传递的,不声明成指针,那么修改只是发生在该类型的一份副本上。

具体可以参考官方的FAQ

但不管怎么说,个人不喜欢go的这种表达方法,因为不直观迷惑人


var a *TZ只是声明了一个指向TZ类型的空指针,如果直接调用a.Increase(100)程序可以编译,但是运行时会报错,因为你在Increase方面里做了dereference的操作:*tz
正确做法应该是和geidoo所说的先赋值:a = new(TZ)

var a *TZ,这个语句本来就是错的。

@geidoo 这个说法不正确,这个声明是合法的,只是题主没有做空指针初始化而已。

【热门文章】
【热门文章】