首页 > 解决方案 > big.Int 和 *big.Int 之间的区别,以及如何按值传递 big.Int

问题描述

我可以在 big.Int 上使用 Text() 之类的方法,它工作正常,但如果我返回 big.Int,则使用“myfunc().Text()”会引发错误,而如果我返回 *big.Int ,我没有错误。为什么我可以在 big.Int、*big.Int 和返回 *big.Int 的函数上使用 Text(),但不能在返回值为 big.Int 的函数上使用?

https://play.golang.org/p/ovgeQDHFstP

基于这种行为和其他行为(例如它的打印方式),似乎 *big.Int 是打算使用的类型,对吗?

此外,如果我创建并使用 big.Int 或 *big.Int 类型的变量,它会通过引用传递。没关系。但是,如果我想按值传递一个,那最好怎么做呢?

我应该创建一个新的 big.Int 并使用 Set() 将其设置为原始值并传递它吗?还是应该将原始 big.Int 传入,并在函数内使用 Set() 将其值复制到新的 big.Int 中?或者还有其他更好的方法吗?

标签: pointersgobiginteger

解决方案


Text()方法是为接收器类型定义的*big.Int,因此显然您可以在该类型的变量和返回的函数的返回值上调用它*big.Int。您也可以在 type 的变量上调用它big.Int,因为当您尝试调用变量的指针方法时,Go 会自动获取变量的地址,只是为了省去输入额外 & 符号的麻烦。

但是,您不能在函数返回的返回值上调用它big.Int,因为该值是不可寻址的。以下是规范对可寻址性的说明:

对于 T 类型的操作数 x,地址操作 &x 生成 *T 类型的指向 x 的指针。操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是(可能带括号的)复合文字。

你的返回值不是这些东西,所以你不能使用指针方法,就像你可以写一样foo := &myFunc()。要解决此问题,您可以将返回值保存在变量中以使其可寻址。但很可能您的函数首先应该返回一个指针。

另请注意,Go 中没有引用。一切都是按值传递的,指针和其他指针一样是值。


推荐阅读