例如,将父结构嵌入到子结构中后:
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 结构向上转换为父结构,但像操作子结构一样操作它。有没有办法使用接口(interface)来解决这个问题?
如何消除 fmt.Println(x.Ident)
行中的错误“x.Ident undefined(类型 ParentNode 没有字段或方法 Ident)”
最佳答案
它不会返回子结构。您所做的不是对子结构进行类型转换,而只是返回其字段之一。使用更具体的示例,上面的 go 代码片段就像尝试使用 Employee 的名称,就好像它是 Employee 的父类(super class)一样。
不过,您的猜测是正确的,实现像 ArrayList 和 List 这样的“is-a”关系的方法是使用接口(interface)。但要知道,接口(interface)只能为方法调用提供多态性,而不能为字段访问提供多态性。您的示例的修改版本希望有所帮助,可以在以下位置找到:
http://play.golang.org/p/qclS5KR64H
您可能会发现阅读 go 规范的“结构类型”部分和/或整个规范很有帮助(它没有那么长!也没有那么可怕!):
关于inheritance - Golang : when typecasting child struct to parent struct, 子结构信息丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716109/