web-dev-qa-db-ja.com

Go構造体の比較

比較演算子 のGoプログラミング言語仕様セクションでは、比較可能なフィールドのみを含む構造体は比較可能であるべきだと考えています。

すべてのフィールドが比較可能な場合、構造体の値は比較可能です。対応する非空白フィールドが等しい場合、2つの構造体の値は等しくなります。

そのため、「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")
  }
}

ただし、それは コンパイルに失敗します というメッセージで:

無効な操作:alice> = carol(演算子> =は構造体で定義されていません)

私は何が欠けていますか?

14
maerics

正しいです、構造体はcomparableですが、ordered(- 仕様 ):

等号演算子==および!=は、比較可能なオペランドに適用されます。順序付け演算子<<=>、および>=は、順序付けられたオペランドに適用されます。

...

  • すべてのフィールドが比較可能な場合、構造体の値はcomparableです。対応する非空白フィールドが等しい場合、2つの構造体の値は等しくなります。

>=は順序付けられた演算子であり、同等のものではありません。

27
Tim Cooper

プログラムをコンパイルするには、比較するフィールドを定義する必要があります。

if alice.Score >= carol.Score

その後、コンパイルして印刷します

アリス> =キャロル

2
nosequeldeebee