空の構造体の配列の比較: 変数の動作を理解する
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 サイトの他の関連記事を参照してください。