=` または `" />
Go 構造体の比較: Comparable と Ordered の間の誤解
Go では、すべてのフィールドが比較可能な場合、構造体はデフォルトで比較可能なものとみなされます。これは、等価演算子 (== または !=) を使用して、構造体を同じ型の変数に代入したり、同じ型の別の構造体と比較したりできることを意味します。
ただし、これを行おうとすると、よくある誤解が生じます。構造体では >= や <= などの順序付き演算子を使用します。構造体は比較可能ですが、本質的に順序付けられていません。この区別は、Go プログラミングを効果的に行うために理解することが重要です。
この例では:
package main type Student struct { Name string // "String values are comparable and ordered, lexically byte-wise." Score uint8 // "Integer values are comparable and ordered, in the usual way." } func main() { alice := Student{"Alice", 98} carol := Student{"Carol", 72} if alice >= carol { println("Alice >= Carol") } else { println("Alice < Carol") } }
>= は順序付き演算子であるため、コードはコンパイルに失敗します。コンパイラは、Student が順序付き比較をサポートするために必要な順序付き型として明示的に定義されていないことを検出します。 == または != を使用して構造体の値が等しいかどうかを比較できますが、それらの順序関係 (つまり、<、>、<=、>=) は定義されていません。
Go 言語仕様には明確に記載されています。 :
"順序付け演算子 <、<=、>、および >= は、順序付けされたオペランドに適用されます。[...] 構造体の値は、すべてのフィールドが比較可能であれば比較可能です。2 つの構造体対応する空白以外のフィールドが等しい場合、値は等しいです。
したがって、構造体は本質的に順序付けされておらず、>= のような順序付き演算子は、順序付き型として明示的に宣言されていない限り、構造体の値ではサポートされません。順序付き比較を有効にするには、カスタム型で sort.Interface インターフェイスを実装する必要があります。これには、型のインスタンスを並べ替えおよび比較するための特定のメソッドを定義する必要があります。
以上がGo 構造体を `>=` または ` と比較できないのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。