big.Int和* big.Int之间的区别,以及如何通过值传递big.Int

时间:2019-02-05 03:56:40

标签: pointers go biginteger

我可以在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?还是有其他更好的方法呢?

2 个答案:

答案 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