为什么不能将结构转换为嵌入类型

rco*_*rre 0 type-conversion go

package main

type Inner struct {
    x int
}

type Outer struct {
    Inner
}

func main() {
    x := Inner{1}
    y := (Outer)(x) // cannot convert x (type Inner) to type Outer
}
Run Code Online (Sandbox Code Playgroud)

关于转化的go规范部分声称

在以下任何一种情况下,非常数值x都可以转换为类型T:...忽略struct标签(见下文),x的类型和T具有相同的底层类型....

关于类型标识的部分说:

如果两个结构类型具有相同的字段序列,并且相应的字段具有相同的名称,相同的类型和相同的标记,则它们是相同的.

这是我的理解,这两个InnerOuter有单场x这是一个int.那么为什么我不能将其转换OuterInner

我最终发现我可以使用x.Inner,但它花了我一段时间,所以我很好奇为什么(在我看来)更明显的方法是不允许的.

Jim*_*imB 5

Outer没有字段x.它有一个领域Inner,有一个领域x.访问时.x,选择器(.)将自动从最浅的深度提升嵌入的字段x.

请参阅选择器的规格