去和接口{}相等

Med*_*her 5 interface go

我有以下代码:

package main

import "fmt"

func main() {
    fmt.Println(interface{}(1) == interface{}(1))

    var a *int
    fmt.Println(a == nil)
    fmt.Println(interface{}(a) == interface{}(nil))
}
Run Code Online (Sandbox Code Playgroud)

它输出:

true
true
false
Run Code Online (Sandbox Code Playgroud)

我想知道为什么.在第一种情况下,可以看出,将一个值包装在一个interface{}不会停止等式的确定,并且nil包含在一个中的零指针(等于)与interface{}它不相同interface{}(nil).为什么是这样?

Jam*_*dge 6

接口值打包两个数据:(1)类型和(2)该类型的值.关于比较的主题,规范说:

接口值具有可比性.如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值都为nil,则它们相等.

因此,两个数据片段必须相等才能使接口值相等.

在您的最后一个示例中,interface{}(a)具有动态类型*int和动态值nil,同时interface{}(nil)具有动态类型nil(即没有类型集)和动态值nil.由于类型不匹配,因此这两个值不相等.