Go 接口比较令人困惑

Mia*_*Yao 1 syntax go

为什么全局变量a1不等于局部变量a2,而a2等于a3和a4

我很困惑,a1,a2,a3都是通过调用getInterface方法计算的,但是比较它们时,却得到了不同的结果。

谢谢大家看到这个问题。


import "fmt"

var a1 aInterface = getInterface()

type aInterface interface {
    fun1()
}

type aInterfaceImpl struct{}

func (p *aInterfaceImpl) fun1() {
    return
}

func getInterface() aInterface {
    return new(aInterfaceImpl)
}

func main() {
    var a2 aInterface = getInterface()
    var a3 aInterface = getInterface()
    var a4 aInterface = new(aInterfaceImpl)
    fmt.Printf("a1 == a2, %+v\n", a1 == a2) // a1 == a2, false
    fmt.Printf("a2 == a3, %+v\n", a2 == a3) // a2 == a3, true
    fmt.Printf("a2 == a4, %+v\n", a2 == a4) // a2 == a4, true
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

规范:比较运算符:

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

在您的示例中a1a2,a3a4都是接口值,它们都包含具体类型的值*aInterfaceImpl,因此归结为指针比较:

指针值是可比较的。如果两个指针值指向同一个变量或两者都有 value ,则它们相等nil指向不同的零大小变量的指针可能相等,也可能不相等。

由于大小aInterfaceImpl为零(它是一个空的结构类型),根据规范,您不能期望它们的地址相等。他们可能有也可能没有相同的地址,两者都是有效的。

请参阅相关:为什么结构数组比较有不同的结果