golang math/big 库中的奇怪语法
Weird syntax in golang math/big library
我正在使用 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
等函数也 return 运算结果 (https://golang.org/src/math/big/int.go?s=18912:18945#L798)。
为什么您认为这是选择的实施方式?
这可能是因为性能或众所周知的不良垃圾收集?
这只是单纯的好奇心,提前致谢!
这些函数正在处理占用大量内存的结构(否则您将只使用 int64),因此最简单的优化是不要进行无用的分配。因此他们使用指针并将结果放在已经分配好的内存中。
不知道有什么奇怪的,这和非大操作是一致的。例如。在 int
操作数上使用按位与 不会 更改操作数:
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
这也意味着如果你准备了一个变量,你可以将它用作"target",来存储结果。就像你可以使用现有的 int
变量来存储上面 a & b
表达式的结果:
c = a & b
z.And(x, y)
这意味着您不需要重新分配新的 big.Int
值来获得结果(性能影响)。
并且这些方法通常 return 相同的指针,因此您可以链接特定操作。
Methods of this form typically return the incoming receiver as well, to enable simple call chaining.
所以你也可以这样做:
fmt.Println(z.And(x, y).BitLen()) // Prints 2
尝试 Go Playground 上的示例。
我正在使用 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
等函数也 return 运算结果 (https://golang.org/src/math/big/int.go?s=18912:18945#L798)。
为什么您认为这是选择的实施方式?
这可能是因为性能或众所周知的不良垃圾收集? 这只是单纯的好奇心,提前致谢!
这些函数正在处理占用大量内存的结构(否则您将只使用 int64),因此最简单的优化是不要进行无用的分配。因此他们使用指针并将结果放在已经分配好的内存中。
不知道有什么奇怪的,这和非大操作是一致的。例如。在 int
操作数上使用按位与 不会 更改操作数:
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
这也意味着如果你准备了一个变量,你可以将它用作"target",来存储结果。就像你可以使用现有的 int
变量来存储上面 a & b
表达式的结果:
c = a & b
z.And(x, y)
这意味着您不需要重新分配新的 big.Int
值来获得结果(性能影响)。
并且这些方法通常 return 相同的指针,因此您可以链接特定操作。
Methods of this form typically return the incoming receiver as well, to enable simple call chaining.
所以你也可以这样做:
fmt.Println(z.And(x, y).BitLen()) // Prints 2
尝试 Go Playground 上的示例。