我不明白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{}
会使它们不平等呢?
发布于 2016-04-19 13:41:07
为什么x,==,y的结果为真?
如果
结构值的所有字段都是可比较的,则它们是可比较的。如果两个结构值对应的非空字段相等,则两个结构值相等。
string
的零值为""
,因此x.bar
和y.bar
相等,因此x
和y
相等。
为什么将它们强制转换为接口{}会使它们不相等?
同样,来自语言规范的同一页:
接口值具有可比性。如果两个接口值具有相同的动态类型和相等的动态值,或者两个接口值都为nil,则这两个接口值相等。
发布于 2016-04-19 13:44:26
它们具有不同的类型,但由于结构具有相同的字段名称/类型,因此具有可比性。如果您尝试重命名该字段,它将无法编译。
它们与接口{}值相当,但它们的动态类型不同-您可以使用fmt %T
动词来检查这一点
https://stackoverflow.com/questions/36719925
复制相似问题