我不明白为什么第一个结果是假的,而第二个结果是真的。
任何帮助将不胜感激。
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
在这里试试Go playground
答案 0 :(得分:10)
因为0
是一个非类型化常量,其默认类型为int
,而不是uint64
,并且在与接口进行比较时,您要比较的内容必须是同一类型并且它们的相同值被认为是相同的。
https://golang.org/ref/spec#Comparison_operators
相等运算符==和!=适用于可比较的操作数。排序运算符<,< =,>和> =适用于已排序的操作数。这些术语和比较结果定义如下:
当X类型的值相当且X实现T时,非接口类型X的值x和接口类型T的值t是可比较的。如果t的动态类型与X相同并且t的动态值是等于x。