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{}使它们不平等?


泛舟湖上清波郎朗
浏览 137回答 2
2回答

眼眸繁星

为什么 x == y 为真?从Go 语言规范:如果所有字段都具有可比性,则结构值具有可比性。如果它们对应的非空白字段相等,则两个结构值相等。a 的零值string是"",所以x.bar和y.bar相等,因此x和y相等。为什么将它们转换为 interface{} 会使它们不平等?同样,来自语言规范的同一页面:接口值具有可比性。如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值为 nil,则它们相等。

繁星coding

它们具有不同的类型但具有可比性,因为结构具有相同的字段名称/类型。如果您尝试重命名该字段,它将无法编译。它们与 interface{} 值相当,但它们的动态类型不同 - 您可以使用 fmt%T动词检查这一点http://play.golang.org/p/x0w30RIb5a
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python