为什么Go中的大型int api如此奇怪?

Kug*_*gel 11 biginteger go

我正在努力理解big int api背后的设计决策.

例如,要添加两个大的int,您必须:

a := big.NewInt(10)
b := big.NewInt(20)
c := big.NewInt(0)
d := c.Add(a,b)
Run Code Online (Sandbox Code Playgroud)

其中d与末尾的c相同.初始零点无关紧要.

为什么不呢:

a := big.NewInt(10)
b := big.NewInt(20)
c := big.Add(a,b)
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

a := big.NewInt(10)
b := big.NewInt(20)
c := a.Add(b)
Run Code Online (Sandbox Code Playgroud)

他们选择这样做有什么理由吗?我发现它有点令人困惑,每当我使用它时都要查找它.

Den*_*ret 11

Add 是一种改变接收器的方法.

所以就这么做

c := big.NewInt(0).Add(a,b)
Run Code Online (Sandbox Code Playgroud)

要么

var c big.Int
c.Add(a,b) 
Run Code Online (Sandbox Code Playgroud)

Add返回接收器的事实对于函数链很有用,但是您不需要使用返回的值.

现在假设我们不会将bigInt作为receiver(c := big.Add(a,b))或者接收器不会被修改(c := a.Add(b)).在这两种情况下,都必须为操作分配一个大的Int并返回(作为指针).如果您已经分配了大量的Int并准备就绪,这将是浪费.计算的整数不仅仅是一个简单的一个或两个单词struct,它可能很大.所以最好允许使用预定义的var,特别是因为你经常在计算循环中使用你的大整数.

c := big.Add(a,b) // wasteful because doesn't allow the use of a preexisting big int

c := a.Add(b) // either modifies a (which would force you to copy it each time if you want to keep it) or is wasteful like the last one
Run Code Online (Sandbox Code Playgroud)

  • 与例如GMP的架构相比:`mpz_foo(mpz_t*rop,mpz_t*op1,mpz_t*op2)`.就像Go中的`rop.Foo(op1,op2)`. (2认同)