2016-04-19 11 views
3

goが匿名構造をどのように比較しているのか分かりません。Go:匿名の構造体を比較する

package main 

import (
    "fmt" 
) 

type foo struct { 
    bar string 
} 

func main() { 
    var x struct { 
     bar string 
    } 
    var y foo 
    fmt.Println(x == y) // this prints true 
    equals(x, y) // this prints false 

} 


func equals(a, b interface{}) { 
    fmt.Println(a == b) 
} 

なぜx == y利回りtrue:私は、コードのこの部分を理解しようとしていますか?彼らはタイプが異なるので、比較することはできません。

と同じですが、なぜそれらをinterface{}にキャストするとそれらが不等になりますか?

答えて

3

なぜx == yが成立するのですか?

Go language specificationから:すべてのフィールドが同等である場合

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

stringゼロ値はとてもx.bary.barが等しく、したがってxyが等しい、""あります。


{}をインタフェースするためにそれらをキャスト、なぜそれらが等しくないのでしょうか?再び

、言語仕様で同じページから:

インタフェース値は同等です。 2つのインタフェース値は、同じ動的型と等しい動的値を持つ場合、または両方が値nilの場合は等しいです。

+0

でこれを確認することができます。また、理由を説明するための仕様からこれら三つの引用符を追加することができます"2番目のオペランドの型に第1オペランドを代入可能でなければなりません"、 "値xはT型の変数に代入可能です(" xはTに代入可能 ")。これらのケースのいずれか: xの型はTと同じです。 "、" 2つの構造体の型は、フィールドのシーケンスが同じであれば同じです。 ndingフィールドは同じ名前、同じタイプ、同じタグを持ちます。 – Art

2

これらのフィールドは異なる型を持ちますが、構造体には同じフィールド名/型があるので比較できます。フィールドの名前を変更しようとすると、コンパイルされません。

彼らはインターフェイス{}値として同等であるが、そのダイナミックな種類が異なっている - あなたはFMT %T動詞

http://play.golang.org/p/x0w30RIb5a