Golang:当将子结构类型转换为父结构时,子结构信息丢失了吗?

时间:2015-11-15 03:31:50

标签: inheritance struct go subclass

例如,在子结构中嵌入父结构后:

type ParentNode struct {
}

type ChildNode struct {
    ParentNode
    Ident string
}

func ParentType() ParentNode { 
    child := ChildNode{Ident : "node"}
    fmt.Println(child)
    return child.ParentNode 
}

func main() {
    x := ParentType()
    fmt.Println(x.Ident)

}

这会打印出“node”并返回包含在父结构中的子结构包含所有信息,这样我们可以在拥有实际的子结构时操作明显的父结构吗?这个想法类似于Java,你可以返回一个明显类型的List但返回一个实际类型的LinkedList。

如果没有,那么实现此功能的最佳方法是什么?本质上我想将Child结构向上转换为父结构,但操纵它就好像它是一个子结构。有没有办法使用界面解决这个问题?

如何摆脱错误“x.Ident undefined(类型ParentNode没有字段或方法Ident)”在第fmt.Println(x.Ident)

1 个答案:

答案 0 :(得分:1)

它不会返回子结构。你正在做的是类型化子结构,但只返回其中一个字段。要使用更具体的示例,上面的go片段就像尝试使用Employee的名称一样,就像它是Employee的超类一样。

你的猜测是正确的,实现像ArrayList和List这样的“is-a”关系的方法是使用接口。但是,要知道接口只能为方法调用提供多态性,而不能为字段访问提供多态性。您可以在以下位置找到您的示例的修改版本,希望对您有所帮助:

http://play.golang.org/p/qclS5KR64H

您可能会发现阅读go规范的“结构类型”部分和/或整个规范(它不是那么长!或者可怕!)会很有帮助。:

https://golang.org/ref/spec#Struct_types