Interface and integer comparison in golang

I don’t understand why the first result is false and the second is true.

Any help would be appreciated.

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 

Try it here Go to the site

+8
go
source share
1 answer

Because 0 is an untyped constant whose default type is int , not uint64 , and when comparing with an interface, the thing you are comparing with must be of the same type, and the same value for them is considered equal.

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

The equality operators == and! = Are applicable to comparable operands. The ordering operators <, <=,> and> = are applied to ordered operands. These terms and the result of comparisons are defined as follows:

The value x of the non-interface type X and the value t of the type T of the interface are comparable when the values ​​of type X are comparable, and X implements T. They are equal if t the dynamic type is identical to X and t the dynamic value is equal to x.

+10
source share

All Articles