尽管符合 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中文网其他相关文章!