2017-01-06 15 views
8

なぜ秒が真である間に最初の結果がfalseであるのか分かりません。golangのインタフェースと整数の比較

ご協力いただければ幸いです。

func main() { 
    var i interface{} 

    i = uint64(0) 
    fmt.Println("[1] ", reflect.TypeOf(i), i == 0) 

    i = 0 
    fmt.Println("[2] ", reflect.TypeOf(i), i == 0) 

    var n uint64 = 32 
    fmt.Println("[3] ", reflect.TypeOf(n), n == 32) 
} 

// result 
// [1] uint64 false 
// [2] int true 
// [3] uint64 true 

0は、そのデフォルトタイプintある、ないuint64型を持たない定数であり、およびインタフェースとの比較をするとき、あなたがに比較している事は同じタイプの両方でなければならないので、ここでGo playground

答えて

10

を試してみようそれらが等しいとみなされるのと同じ値である。

https://golang.org/ref/spec#Comparison_operators

等価演算子==と!=匹敵するオペランドに適用されます。順序付け演算子<、< =、>、および> =は、順序付けられたオペランドに適用されます。

タイプXの値が匹敵し、XがTを実装する場合、非インターフェイスタイプXの値xとインタフェースタイプTの値tは比較可能です。これらは次のように定義されています。等しい場合、tの動的型がXと同じであり、tの動的値がxと等しい場合は等しい

+0

なぜ 'i(uint64)== 0'のような型アサーションを使用できますか?コンパイラは '0'も' uint64'ですか? https://play.golang.org/p/YT-pZCdI27 – Ngenator

+2

タイプアサーションを実行すると、インタフェースと値を比較しなくなり、値と値を比較しているので、ダイナミックタイプは等しい必要があります。 – dave

+1

技術的には '0'は' int'ではありませんが、それは ''型指定されない定数 ''(https://golang.org/ref/spec#Constants)です。表現。 – JimB