Comparison operators上的Go编程语言规范部分让我相信只包含可比较字段的结构应具有可比性:
如果所有字段都具有可比性,则结构值具有可比性。如果相应的非空白字段相等,则两个struct值相等。
因此,我希望编译以下代码,因为“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")
}
}
但是,fails to compile的消息为:
无效操作:alice&gt; = carol(运算符&gt; =未在struct上定义)
我错过了什么?
答案 0 :(得分:25)
你是对的,结构可比,但不是有序(spec):
等于运算符
==
和!=
适用于可比较的操作数。排序运算符<
,<=
,>
和>=
适用于已排序的操作数。...
- 如果所有字段都具有可比性,则结构值可比较。如果相应的非空白字段相等,则两个struct值相等。
>=
是一个有序的运算符,而不是类似的运算符。
答案 1 :(得分:2)
您必须定义要比较的字段才能使程序编译。
if alice.Score >= carol.Score
然后编译并打印
Alice&gt; = Carol