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 中它说:

如果两个结构类型具有相同的字段序列,并且对应的字段具有相同的名称、相同的类型和相同的标签,则它们是相同的。来自不同包的非导出字段名称总是不同的。

所以,我希望类型AB是相同的。在规范:可分配性中它说:

如果满足以下条件之一,则值 x 可分配给 T 类型的变量(“x 可分配给 T”):

  • x 的类型与 T 相同。

鉴于所有这些信息,我倾向于认为分配应该成功,因为 的类型与A{}相同B,但显然我遗漏了一些东西。

那么,我在这里缺少什么来了解错误消息的根本原因?

回答

请注意,您指向的定义以:

A defined type is always different from any other type.

AB是定义的类型,它们有不同的名称,所以它们是不同的。类型struct { v int }与任何类型相同struct {v int},但在这种情况下,这些不是定义的类型。例如,您可以声明:

func f(x struct {v int})

然后你可以调用:

f(struct {v int}{v:1})

这两个结构是相等的。

您仍然可以分配AB使用:

var b B = B(A{})

这工作,因为底层的类型AB结构相同。


以上是Golang结构可赋值性和类型标识的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>