向下倾斜较高型

Par*_*aub 1 struct embedding type-conversion go

是否旁边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
}
Run Code Online (Sandbox Code Playgroud)

去操场

// works, but is quite verbose for structs with more members
box := Box{Name: rated.Name}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 6

在结构中嵌入类型会在结构中添加一个字段,您可以使用非限定类型名称来引用它(不合格意味着省略包名称和可选指针符号).

例如:

box := rated.Box
fmt.Printf("%T %+v", box, box)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

main.Box {Name:foo}
Run Code Online (Sandbox Code Playgroud)

请注意,赋值会复制该值,因此box局部变量将保存该RatedBox.Box字段值的副本.如果您希望它们是"相同"(指向相同的Box值),请使用指针,例如:

box := &rated.Box
fmt.Printf("%T %+v", box, box)
Run Code Online (Sandbox Code Playgroud)

但这里当然box会有类型*Box.

或者您可以选择嵌入指针类型:

type RatedBox struct {
    *Box
    Points int
}
Run Code Online (Sandbox Code Playgroud)

然后(在Go Playground上试试):

rated := RatedBox{Box: &Box{Name: "foo"}, Points: 10}

box := rated.Box
fmt.Printf("%T %+v", box, box)
Run Code Online (Sandbox Code Playgroud)

最后2的输出:

*main.Box &{Name:foo}
Run Code Online (Sandbox Code Playgroud)

  • Go不像C++或Java那样面向对象.对于需要多态性的情况,您应该使用接口.没有它们,这个答案是你能做到的最好的答案. (3认同)