我不明白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{}
使它们不平等?
答案 0 :(得分:3)
为什么x == y得到真?
如果所有字段都具有可比性,则结构值具有可比性。如果相应的非空白字段相等,则两个struct值相等。
string
的零值为""
,因此x.bar
和y.bar
相等,因此x
和y
为相等。
为什么将它们转换为接口{}会使它们不相等?
同样,来自语言规范中的同一页面:
界面值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者的值都为nil,则它们相等。
答案 1 :(得分:2)
它们具有不同的类型,但具有可比性,因为结构具有相同的字段名称/类型。如果您尝试重命名该字段,则无法编译。
它们与interface {}值相当,但它们的动态类型不同 - 您可以使用fmt %T
动词来检查它