向下倾斜较高型

时间:2017-07-26 13:14:22

标签: go struct type-conversion embedding

是否可以手动复制内部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
}

go-playground

// works, but is quite verbose for structs with more members
box := Box{Name: rated.Name}

1 个答案:

答案 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}