pointers - big.Int 和 *big.Int 之间的区别,以及如何按值传递 big.Int

标签 pointers go biginteger

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

最佳答案

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

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

For an operand x of type T, the address operation &x generates a pointer of type *T to x. The operand must be addressable, that is, either a variable, pointer indirection, or slice indexing operation; or a field selector of an addressable struct operand; or an array indexing operation of an addressable array. As an exception to the addressability requirement, x may also be a (possibly parenthesized) composite literal.

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

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

关于pointers - big.Int 和 *big.Int 之间的区别,以及如何按值传递 big.Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54527525/

相关文章:

C - int 数组到 char* 的转换

c++ - 从文件中提取数据并将其存储在 C++ 中的字符串中

c - 尝试复制数组的内容

c++ - map中operator[]插入的指针类型的值是否总是NULL?

go - 在 Golang 中通过 COM 与 Lotus Notes 交互

java - 小数点后有 2 个分数的 BigDecimal?

java - 关于 java.math.BigInteger

go - iota 的确切含义是什么?

mongodb - 如何通过管道函数获取子字段值

java - BigInteger 如何在 Java 中将字节数组转换为数字?