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部分说:
如果两个结构类型具有相同的字段序列,并且相应的字段具有相同的名称,相同的类型和相同的标记,则它们是相同的。
据我了解,Inner
和Outer
都有一个字段x
,即int
。那么为什么我不能将Outer
转换为Inner
?
我最终发现我可以使用x.Inner
,但它花了我一段时间,所以我很好奇为什么(在我看来)更明显的方法是不允许的。
答案 0 :(得分:5)
Outer
没有字段x
。它有一个字段Inner
,其中包含字段x
。访问.x
时,选择器(.
)会自动从最浅的深度提升嵌入字段,其中存在x
。
请参阅Selectors
上的规范答案 1 :(得分:1)
以下代码段用于支持JimB的回答 - Inner
和Outer
不共享相同的字段序列,因此不符合转换条件。
它可以帮助您逐字地看到Inner
和Outer
类型之间的区别:
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)
}