Inheritance Golang:将子结构类型转换为父结构类型时,子结构信息是否丢失?

Inheritance Golang:将子结构类型转换为父结构类型时,子结构信息是否丢失?,inheritance,struct,go,subclass,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 :=

例如,将父结构嵌入子结构后:

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,在Java中,您可以返回表观类型的列表,但返回实际类型的LinkedList

如果没有,实现此功能的最佳方式是什么?本质上,我希望将子结构向上转换为父结构,但将其作为子结构进行操作。有没有办法用接口解决这个问题


如何消除第
fmt.Println(x.Ident)

行中的错误“x.Ident undefined(type ParentNode没有字段或方法Ident)”。您所做的不是对子结构进行类型转换,而是返回它的一个字段。使用一个更具体的例子,上面的go代码片段就像试图使用雇员的名字,就好像它是雇员的超类一样

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

您可能会发现阅读go规范的“结构类型”部分和/或整个规范(没有那么长!也没有那么吓人!)很有帮助: