前往:比较匿名结构

Pap*_*ter 3 go

我不明白如何go比较匿名结构。我试图理解这段代码:

package main

import (
    "fmt"
)

type foo struct {
    bar string
}

func main() {
    var x struct {
        bar string
    }
    var y foo
    fmt.Println(x == y) // this prints true
    equals(x, y) // this prints false

}


func equals(a, b interface{}) {
    fmt.Println(a == b)
}
Run Code Online (Sandbox Code Playgroud)

为什么会x == y产生收益true?它们具有不同的类型,因此我希望无法将它们进行比较。

而且,由于它们是平等的,为什么要抛弃它们以interface{}使其不平等?

Mic*_*ael 5

为什么x == y产生真实值?

根据Go语言规范

如果结构的所有字段都可比较,则它们的值可比较。如果两个结构值对应的非空白字段相等,则它们相等。

a的零值string"",所以x.bary.bar相等,因此xy相等。


为什么将它们强制转换为interface {}会使它们不相等?

同样,在语言规范的同一页面上:

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