【问题标题】:Weird syntax in golang math/big library [closed]golang数学/大库中的奇怪语法[关闭]
【发布时间】:2018-05-14 07:35:42
【问题描述】:

我正在使用 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)。

您为什么认为这是选择的实现方式?

这可能是因为性能或众所周知的不良垃圾收集吗? 这只是纯粹的好奇,在此先感谢!

【问题讨论】:

    标签: go syntax binary-operators language-implementation


    【解决方案1】:

    我不知道有什么奇怪的,这与非大操作的工作方式是一致的。例如。在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
    

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

    c = a & b
    
    z.And(x, y)
    

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

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

    这种形式的方法通常也会返回传入的接收者,以启用简单的调用链。

    所以你也可以这样做:

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

    尝试Go Playground 上的示例。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 2017-10-16
        • 2015-08-05
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 2014-10-06
        相关资源
        最近更新 更多