为了账号安全,请及时绑定邮箱和手机立即绑定

Go:比较匿名结构

Go:比较匿名结构

泛舟湖上清波郎朗 2022-01-04 20:59:23
我不明白如何go比较匿名结构。我试图理解这段代码:package mainimport (    "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 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

为什么 x == y 为真?

Go 语言规范

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

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


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

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

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


查看完整回答
反对 回复 2022-01-04
?
繁星coding

TA贡献1797条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信