空の構造体の配列比較で予期しない結果が生じる理由
Go では、構造体ポインターの配列を比較すると、予期しない結果が生じる可能性があります。空の構造体。この記事では、これらの不可解な結果の背後にある理由を詳しく掘り下げます。
空の構造体の比較
空の構造体を比較する場合、Go の仕様では 2 つの異なるサイズ 0 の変数を指すと規定されています。等しい場合もあれば、等しくない場合もあります。これは、&&s == &ss は空の構造体 s および ss に対して true または false に評価できることを意味します。同じプログラムの実行が異なると動作が異なる場合があります。
配列の比較
最初は、空の構造体ポインター (arr1 == arr2) の配列を比較すると予想されるかもしれません。これらは異なるメモリ アドレスのセットを参照するため、常に false になります。ただし、場合によっては、予期せず true が得られることがあります。
エスケープ分析の影響
動作は、変数がメモリにどのように格納されるかを決定するエスケープ分析の影響を受けます。 &s と &ss が fmt.Println() などの関数に渡されると、それらは関数のスコープをエスケープし、ヒープ上に割り当てられます。この割り当てプロセスによりアドレスが変更され、予期しない比較が行われる可能性があります。
次のコード スニペットを考えてみましょう:
var s, ss struct{} arr1 := [6]*struct{}{&s} arr2 := [6]*struct{}{&ss} fmt.Println(&s == &ss, arr1 == arr2) // true, true
この場合、エスケープ分析により、&s と &ss が main 関数をエスケープし、それらをヒープ上に割り当てます。この割り当てプロセスによりアドレスが変更され、&s == &ss と arr1 == arr2 の両方が true と評価されます。
結論
空の構造体の配列の比較ポインタは、特にエスケープ解析が含まれる場合、異なる変数のアドレスが等しい可能性があるため、予測できない結果を引き起こす可能性があります。予期しない動作を避けるために、空の構造体を扱う場合は、構造体の値を明示的に初期化するか、配列の代わりにスライスを使用することをお勧めします。
以上がGo で空の構造体配列の比較が予期せず True を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。