【问题标题】:Go struct comparison去结构比较
【发布时间】:2018-07-14 05:37:36
【问题描述】:

Comparison operators 上的 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")
  }
}

但是,它fails to compile 带有消息:

无效操作:alice >= carol(操作符 >= 未在结构上定义)

我错过了什么?

【问题讨论】:

    标签: go struct comparison


    【解决方案1】:

    你是对的,结构是comparable,但不是ordered (spec):

    相等运算符==!= 适用于可比较的操作数。排序运算符&lt;&lt;=&gt;&gt;= 适用于已排序的操作数。

    ...

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

    &gt;= 是一个有序的运算符,而不是一个可比的。

    【讨论】:

      【解决方案2】:

      您必须定义要比较的字段才能编译程序。

      if alice.Score >= carol.Score
      

      然后编译并打印

      爱丽丝 >= 卡罗尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多