首页  >  文章  >  后端开发  >  为什么 Go 中的结构体比较失败,尽管有可比字段?

为什么 Go 中的结构体比较失败,尽管有可比字段?

Susan Sarandon
Susan Sarandon原创
2024-11-08 10:03:02904浏览

Why Does Struct Comparison Fail in Go Despite Comparable Fields?

Go 结构体比较:为什么预期的比较失败

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn