web-dev-qa-db-ja.com

インターフェースの同等性の確認{}

特定の[]interface{}値をinterface{}スライスで検索しています:

var v interface{}
for i := 0; i < len(A); i++ {
  if (A[i] == v) {
    fmt.Println("Gotcha!")
    break
  }
}

自明な場合、型はintです。しかし、たとえばタイプがカスタムstructの場合はどうすればよいですか?

20
Brian

@CodingPickleコメントのおかげで、私は Goプログラミング言語仕様 から以下を提供します

等価演算子==および!=は、比較可能なオペランドに適用されます。

interface{}sおよびstructsについて:

  • インターフェイス値は同等です。 2つのインターフェース値は、動的タイプが同じで動的値が等しい場合、または両方の値がnilである場合に等しくなります。
  • 非インターフェースタイプXの値xとインターフェースタイプTの値tは、タイプXの値が比較可能であり、XがTを実装している場合に比較可能です。 。
  • 構造体の値は、すべてのフィールドが比較可能であれば比較可能です。 2つの構造体の値は、対応する空白以外のフィールドが等しい場合に等しくなります。

この遊び場を試すこともできます https://play.golang.org/p/bgO1_V87v9k

言い換えれば、Goでの等式の処理は簡単なようです。

27
Brian Vanover

更新:上記の質問と回答が書かれてから、Go言語が少し変更されました。

以前は、2つのインターフェースが比較され、どちらかまたは両方に比較不可能なタイプが含まれていた場合、ランタイムはパニックになっていました。現在、ランタイムは、両方にsame比較不可能なタイプが含まれている場合にのみパニックになります。 (異なるタイプが含まれている場合、どちらのタイプも比較できない場合でも結果はfalseになります。)

比較できないタイプとは何ですか?基本的に、これらはスライス、マップ、関数、およびそれらを使用するすべての構造体または配列型です。

私の知る限り、これはGo 1.9または1.10の周りの静かな変更でした。

0