Golang结构可赋值性和类型标识
我有以下两个结构:
func main() {
type A struct {
v int
}
type B struct {
v int
}
var b B = A{}
}
分配var b B = A{}失败并显示错误消息:
不能使用“A{}”(类型 A)作为类型 B
但是在golang spec:Type identity 中它说:
如果两个结构类型具有相同的字段序列,并且对应的字段具有相同的名称、相同的类型和相同的标签,则它们是相同的。来自不同包的非导出字段名称总是不同的。
所以,我希望类型A和B是相同的。在规范:可分配性中它说:
如果满足以下条件之一,则值 x 可分配给 T 类型的变量(“x 可分配给 T”):
- x 的类型与 T 相同。
鉴于所有这些信息,我倾向于认为分配应该成功,因为 的类型与A{}相同B,但显然我遗漏了一些东西。
那么,我在这里缺少什么来了解错误消息的根本原因?
回答
请注意,您指向的定义以:
A defined type is always different from any other type.
A和B是定义的类型,它们有不同的名称,所以它们是不同的。类型struct { v int }与任何类型相同struct {v int},但在这种情况下,这些不是定义的类型。例如,您可以声明:
func f(x struct {v int})
然后你可以调用:
f(struct {v int}{v:1})
这两个结构是相等的。
您仍然可以分配A和B使用:
var b B = B(A{})
这工作,因为底层的类型A和B结构相同。