golang math / big library中的奇怪语法

时间:2017-11-30 11:26:25

标签: go syntax binary-operators language-implementation

我在golang中使用math/big库来对位串执行操作。一切都运行正常,但我很困惑为什么,对于这个库的大多数功能,语法是:

var num1 big.Int
var num2 big.Int
var result big.Int

// Set num1 and num2 

result.And(&num1,&num2)

而不是:

var num1 big.Int
var num2 big.Int

// Set num1 and num2 

result = num1.And(num2)

由于And等函数也会返回操作结果(https://golang.org/src/math/big/int.go?s=18912:18945#L798)。

为什么你认为这是选择的实施?

这可能是因为性能还是众所周知的垃圾收集错误? 这只是好奇心,提前谢谢!

2 个答案:

答案 0 :(得分:1)

函数处理占用大量内存的结构(否则你只使用int64),所以最简单的优化不是进行无用的分配。因此,他们使用指针并将结果放入已经分配的内存中。

答案 1 :(得分:1)

我不知道什么是奇怪的,这与非大型运营的工作原理是一致的。例如。在int操作数上使用按位AND确实更改操作数:

a, b := 3, 15
c := a & b
fmt.Println(c) // Prints 3

x, y := big.NewInt(3), big.NewInt(15)
z := new(big.Int).And(x, y)
fmt.Println(z) // Prints 3

这也意味着如果您准备好变量,则可以将其用作“目标”来存储结果。就像您可以使用现有的int变量来存储上述a & b表达式的结果一样:

c = a & b

z.And(x, y)

这意味着您无需重新分配新的big.Int值即可获得结果(性能影响)。

这些方法通常返回相同的指针,因此您可以链接特定的操作。

  

此形式的方法通常也返回传入的接收器,以启用简单的呼叫链接。

所以你也可以这样做:

fmt.Println(z.And(x, y).BitLen())  // Prints 2

尝试Go Playground上的示例。