以下、a
に予期せぬ変更が発生しました。 d
は a
(*a
) の値を使用して構築され、d.c
は正しく変更されます。しかし、なぜ a
が Exp
の最初のパラメータに変更されるのでしょうか?
#a が変わらないことを願っています。
a、
b、
d.c、
d.q のポインタ アドレスも
に出力しました。 Exp 前後で異なります:
fmt.Printf("%p %p %p %p \n", &a, &b, &d.c, &d.q)
リーリー
最初に考慮すべきことはy.Exp "Set z = x**y mod |m|
(つまり
m##) # 記号は無視されます)、z が返されます。";したがって、y
の値が変更されます (上記のように)。
の値が変更される理由を理解するには、ドキュメント
から始めることができます:
「浅いコピー」は、上記の
(またはコード内の d := Decimal{*a, *b}
) が行うこととまったく同じです。したがって、解決策は上記のアドバイスに従うことです:
リーリー
(例でも同様のことができます)。
なぜこれが起こるのかを説明するには、
big.Int が定義されていることを確認する必要があります。これにはいくつかのドキュメントを確認する必要がありますが、要約すると次のようになります (単純化!):
リーリー
したがって、その浅いコピーを作成すると、両方のインスタンスのスライスが同じ
を共有することになります (これにより、スライス内の要素が変更されたときに予測できない結果が生じる可能性があります)。 あなたの例では、
set が実行されたときです。これを示す簡単な方法は次のとおりです:
リーリー
以上がGolang は構造内の big.Int に Exp を使用すると、値が奇妙に変化しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。