golang中的接口和整数比较

Ale*_*.Li 9 go

我不明白为什么第一个结果是假的,而第二个结果是真的.

任何帮助将不胜感激.

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
Run Code Online (Sandbox Code Playgroud)

在这里试试去游乐场

dav*_*ave 10

因为0是一个非类型化的常量,其默认类型是int,而且uint64,当与接口进行比较时,您要比较的东西必须是相同的类型和相同的值才能被认为是相等的.

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

等于运算符==和!=适用于可比较的操作数.排序运算符<,<=,>和> =适用于已排序的操作数.这些术语和比较结果定义如下:

当类型X的值可比较且X实现T时,非接口类型X的值x和接口类型T的值t是可比较的.如果t的动态类型与X相同并且t的动态值等于x,则它们相等. .

  • 一旦执行了类型断言,就不再将接口与值进行比较,而是将值与值进行比较,因此您将失去其动态类型需要相等的要求. (2认同)