ホームページ >バックエンド開発 >Golang >Go の空の構造体の配列が、ポインタが異なるにもかかわらず、同じとして比較される場合があるのはなぜですか?

Go の空の構造体の配列が、ポインタが異なるにもかかわらず、同じとして比較される場合があるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-24 01:50:19313ブラウズ

Why Do Arrays of Empty Structs in Go Sometimes Compare as Equal Despite Their Pointers Being Different?

空の構造体の配列の比較: 変数の動作を理解する

Go で空の構造体の配列を比較すると、予期しない結果が発生する可能性があります。コード例を通してこの動作を調べ、なぜそれが起こるのかを理解しましょう。

次のコードを考えてみましょう:

var s, ss struct{} // two empty structs
arr1 := [6]*struct{}{&s} // array with empty struct pointer
arr2 := [6]*struct{}{&ss} // array with empty struct pointer
fmt.Println(&s == &ss, arr1 == arr2)  // false, true

ここでは、空の構造体 s と ss を定義し、配列 arr1 と arr2 を初期化します。これらの構造体へのポインターを取得し、比較結果を出力します。驚くべきことに、&s と &ss は等しくありませんが、arr1 と arr2 は等しいです。

これを理解するには、Go 仕様を参照する必要があります。ポインター値の仕様では、ポインター値が同じ変数を指す場合、または両方の値が nil である場合、それらは等しいと規定されています。重要なのは、異なるサイズのゼロ変数へのポインタが「等しい場合もあれば、等しくない場合もある」ということです。

さらに、フィールドのない構造体のサイズはゼロです。したがって、&s と &ss は異なるサイズ 0 の変数を指し、比較 &s == &ss は true または false に評価される可能性があります。

同様に、配列比較 arr1 == arr2 の動作は保証されません。サイズがゼロの変数の仕様は、それらの変数がメモリ内に同じアドレスを持つ「可能性がある」ことを示しています。したがって、arr1 と arr2 は等しい場合もあれば等しくない場合もあり、結果はプログラムの実行ごとに異なる可能性があります。

要約すると、空の構造体など、サイズがゼロの個別の変数へのポインターを比較すると、予測できない結果が生じる可能性があります。結果。一度は特定の結果が観察されるかもしれませんが、コンパイラがメモリ割り当てを最適化する方法により、その後の実行では異なる結果になる可能性があります。

以上がGo の空の構造体の配列が、ポインタが異なるにもかかわらず、同じとして比較される場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。