構造体のすべてのフィールドが比較可能である構造体の比較可能性に関する Go 仕様に準拠しているにもかかわらず、次のコードは失敗します。コンパイルするには:
type Student struct { Name string Score uint8 } func main() { alice := Student{"Alice", 98} carol := Student{"Carol", 72} if alice >= carol { // Error: "invalid operation" println("Alice >= Carol") } else { println("Alice < Carol") } }
この失敗を理解する鍵は、比較可能性と順序可能性を区別することにあります。
Student 構造体のフィールドは確かに比較可能ですが、>= 演算子は順序付けです。演算子であり、比較可能な演算子ではありません。この区別は Go 仕様で明示的に言及されており、構造体の値は「すべてのフィールドが比較可能な場合は比較可能」と定義されていますが、「対応する空白以外のフィールドが等しい場合は等しい」とのみ定義されています。このコンテキストでは順序付けについては言及されていません。
このコンパイル時エラーを引き起こした誤解は、比較可能性が順序付け可能性を暗黙的に想定していることに起因します。 Go では、これらは別個の概念です。構造体は等しいかどうか比較できますが、フィールドが特定の順序関係を提供しない限り、デフォルトでは順序付けできません。
以上が比較可能なフィールドがあるにもかかわらず、Go で構造体の比較が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。