去:比较匿名结构

时间:2016-04-19 13:28:45

标签: 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)
}

为什么x == y会产生true?它们有不同的类型,所以我希望它们无法比较。

并且,因为它们是平等的,为什么要将它们转换为interface{}使它们不平等?

2 个答案:

答案 0 :(得分:3)

  

为什么x == y得到真?

来自Go language specification

  

如果所有字段都具有可比性,则结构值具有可比性。如果相应的非空白字段相等,则两个struct值相等。

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

  

为什么将它们转换为接口{}会使它们不相等?

同样,来自语言规范中的同一页面:

  

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

答案 1 :(得分:2)

它们具有不同的类型,但具有可比性,因为结构具有相同的字段名称/类型。如果您尝试重命名该字段,则无法编译。

它们与interface {}值相当,但它们的动态类型不同 - 您可以使用fmt %T动词来检查它

http://play.golang.org/p/x0w30RIb5a

相关问题