比較演算子 のGoプログラミング言語仕様セクションでは、比較可能なフィールドのみを含む構造体は比較可能であるべきだと考えています。
すべてのフィールドが比較可能な場合、構造体の値は比較可能です。対応する非空白フィールドが等しい場合、2つの構造体の値は等しくなります。
そのため、「Student」構造体のすべてのフィールドは同等であるため、次のコードがコンパイルされると予想されます。
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")
}
}
ただし、それは コンパイルに失敗します というメッセージで:
無効な操作:alice> = carol(演算子> =は構造体で定義されていません)
私は何が欠けていますか?
正しいです、構造体はcomparableですが、ordered(- 仕様 ):
等号演算子
==
および!=
は、比較可能なオペランドに適用されます。順序付け演算子<
、<=
、>
、および>=
は、順序付けられたオペランドに適用されます。...
- すべてのフィールドが比較可能な場合、構造体の値はcomparableです。対応する非空白フィールドが等しい場合、2つの構造体の値は等しくなります。
>=
は順序付けられた演算子であり、同等のものではありません。
プログラムをコンパイルするには、比較するフィールドを定義する必要があります。
if alice.Score >= carol.Score
その後、コンパイルして印刷します
アリス> =キャロル