=` 或 `" />
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 语言规范明确指出:
“排序运算符 和 >= 适用于已排序的操作数。[...]如果所有字段都可比较,则结构体值是可比较的。如果相应的非空白字段相等,则两个结构体值相等。”
因此,结构体本质上不是有序的,而像 >= 这样的有序运算符则不是。结构值受支持,除非它们被显式声明为有序类型。要启用有序比较,自定义类型必须实现 sort.Interface 接口,这需要定义用于排序和比较类型实例的特定方法。
以上是为什么我不能将 Go 结构体与 `>=` 或 ` 进行比较的详细内容。更多信息请关注PHP中文网其他相关文章!