我可以在big.Int上使用类似Text()的方法,并且可以正常工作,但是如果我返回big.Int,则使用“ myfunc()。Text()”会引发错误,而如果我返回* big.Int,我没有错误。为什么我可以在big.Int,* big.Int以及返回* big.Int的函数上使用Text(),而不能在返回值为big.Int的函数上使用Text()?
https://play.golang.org/p/ovgeQDHFstP
基于此行为和其他行为(例如打印方式),看起来* big.Int是要使用的类型,对吗?
此外,如果我使用并使用big.Int或* big.Int类型的变量,则该变量将通过引用传递。没关系。但是,如果我想按价值传递一个,那最好的做法是什么?
我应该创建一个新的big.Int并使用Set()将其设置为原始值并传递它吗?还是应该传递原始的big.Int并使用函数内部的Set()将其值复制到新的big.Int?还是有其他更好的方法呢?
答案 0 :(得分:0)
Text()
方法是为接收器类型*big.Int
定义的,因此很明显,您可以在该类型的变量和返回*big.Int
的函数的返回值上调用它。您还可以在big.Int
类型的变量上调用它,因为Go在尝试调用其指针方法时会自动获取变量的地址,只是为您省去了键入额外的&符的麻烦。
但是,您不能在返回big.Int
的函数的返回值上调用它,因为该值不可寻址。规范说的是可寻址性:
对于类型T的操作数x,地址操作&x生成一个 * T类型的指针指向x。操作数必须是可寻址的,即 变量,指针间接寻址或切片索引操作; 或可寻址结构操作数的字段选择器;或数组 可寻址数组的索引操作。作为例外 可寻址性要求,x也可能是(可能带有括号) 复合文字。
您的返回值不算什么,因此您只能使用指针方法,而不能写foo := &myFunc()
。要解决此问题,您可以将返回值保存在变量中以使其可寻址。但是您的函数很可能应该首先返回一个指针。
还要注意,Go中没有引用。一切都是通过值传递的,指针就像其他值一样都是值。
答案 1 :(得分:-1)
https://golang.org/pkg/math/big/ Text()
方法具有指针接收器,这意味着如果a为a.Text()
,则只能调用*big.Int
。
*big.Int
是指向big.Int
的指针,有关代码的固定版本,请参见https://play.golang.org/p/dD70b0tPeGp