Go结构体比较

26

Go编程语言规范中比较运算符一节让我相信,一个只包含可比较字段的结构体应该是可比较的:

如果一个结构体的所有字段都是可比较的,则其值是可比较的。如果两个结构体值对应的非空白字段相等,则它们相等。

因此,我期望以下代码能够编译,因为"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")
  }
}

然而,它编译失败,并显示以下消息:

invalid operation: alice >= carol (operator >= not defined on struct)

我漏掉了什么?

2个回答

50
您说得没错,结构体是可以进行“比较”的,但不支持“排序”(参见规范):

等于运算符==!=只适用于可比较的操作数。而有序运算符<<=>>=则适用于有序的操作数。

...

  • 如果结构体的所有字段都是可比较的,则结构体值也是可比较的。当它们对应的非空字段相等时,两个结构体值相等。
>= 是一个有序运算符,而不是一个可比较的运算符。

2

为了使程序编译通过,你需要定义要比较的字段。

if alice.Score >= carol.Score

然后编译并打印出以下内容:

Alice >= Carol


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接