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

时间:2017-09-06 19:10:11

标签: go type-conversion

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
}

conversions上的go规范部分声称

  

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

type identity部分说:

  

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

据我了解,InnerOuter都有一个字段x,即int。那么为什么我不能将Outer转换为Inner

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

2 个答案:

答案 0 :(得分:5)

Outer没有字段x。它有一个字段Inner,其中包含字段x。访问.x时,选择器(.)会自动从最浅的深度提升嵌入字段,其中存在x

请参阅Selectors

上的规范

答案 1 :(得分:1)

以下代码段用于支持JimB的回答 - InnerOuter不共享相同的字段序列,因此不符合转换条件。

它可以帮助您逐字地看到InnerOuter类型之间的区别:

  package main

  import "fmt"

  type Inner struct {
          x int
  }

  type Outer struct {
          Inner
  }

  func main() {
          in := inner{x: 1}
          fmt.Printf("Inner: %+v\n", in)
          fmt.Println()
          out := outer{in}
          fmt.Printf("Outer: %+v\n", out)
  }