ホームページ > バックエンド開発 > Golang > Golang は構造内の big.Int に Exp を使用すると、値が奇妙に変化します

Golang は構造内の big.Int に Exp を使用すると、値が奇妙に変化します

王林
リリース: 2024-02-12 14:00:07
転載
900 人が閲覧しました

Golang 在结构体中使用 Exp for big.Int 奇怪地改变了值

質問内容

以下、aに予期せぬ変更が発生しました。 da (*a) の値を使用して構築され、d.c は正しく変更されます。しかし、なぜ aExp の最初のパラメータに変更されるのでしょうか?

リーリー

#a が変わらないことを願っています。

編集: 追加として、

abd.cd.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 の値が変更されます (上記のように)。

x

の値が変更される理由を理解するには、ドキュメントから始めることができます: 「浅いコピー」は、上記の

y := *x

(またはコード内の d := Decimal{*a, *b}) が行うこととまったく同じです。したがって、解決策は上記のアドバイスに従うことです: リーリー (例でも同様のことができます)。

なぜこれが起こるのかを説明するには、

big.Int が定義されていることを確認する必要があります。これにはいくつかのドキュメントを確認する必要がありますが、要約すると次のようになります (単純化!): リーリー したがって、その浅いコピーを作成すると、両方のインスタンスのスライスが同じ

バッキング配列

を共有することになります (これにより、スライス内の要素が変更されたときに予測できない結果が生じる可能性があります)。 あなたの例では、

set が実行されたときです。これを示す簡単な方法は次のとおりです: リーリー

以上がGolang は構造内の big.Int に Exp を使用すると、値が奇妙に変化しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート