是否可以手动复制内部Box
值语言功能,以便将RatedBox
向下转换为Box
?
type Box struct {
Name string
}
type RatedBox struct {
Box
Points int
}
func main() {
rated := RatedBox{Box: Box{Name: "foo"}, Points: 10}
box := Box(rated) // does not work
}
// works, but is quite verbose for structs with more members
box := Box{Name: rated.Name}
答案 0 :(得分:6)
Embedding结构中的类型向结构中添加一个字段,您可以使用非限定类型名称来引用它(不合格意味着省略包名称和可选指针符号)。
例如:
box := rated.Box
fmt.Printf("%T %+v", box, box)
输出(在Go Playground上尝试):
main.Box {Name:foo}
请注意,assignment会复制该值,因此box
局部变量将保留RatedBox.Box
字段值的副本。如果你希望他们成为"相同的" (指向相同的Box
值),使用指针,例如:
box := &rated.Box
fmt.Printf("%T %+v", box, box)
但是,box
的类型当然是*Box
。
或者您可以选择嵌入指针类型:
type RatedBox struct {
*Box
Points int
}
然后(在Go Playground上试试):
rated := RatedBox{Box: &Box{Name: "foo"}, Points: 10}
box := rated.Box
fmt.Printf("%T %+v", box, box)
最后2的输出:
*main.Box &{Name:foo}