math/big
golang のライブラリを使用して、ビット文字列の操作を実行しています。すべてが正常に動作していますが、このライブラリの関数のほとんどで、構文が次の理由で困惑しています。
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)。
なぜこれが選ばれた実装だと思いますか?
これは、パフォーマンスまたは既知の不良ガベージコレクションが原因である可能性がありますか?これは単なる好奇心です、事前に感謝します!
何がおかしいのかわかりませんが、これは大規模でない操作の動作と一致しています。たとえば、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で例を試してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加