例如在将父结构嵌入子结构之后:
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)
}
这是否会打印出“节点”并返回包含所有信息的包含在父结构中的子结构,这样我们就可以在拥有实际子结构的同时操作表面上的父结构?这样做的想法类似于 Java,您可以返回表面上类型的 List,但返回实际类型的 LinkedList。
如果没有,实现此功能的最佳方法是什么?本质上,我想将 Child 结构向上转换为父结构,但将其作为子结构进行操作。有没有办法使用接口(interface)解决这个问题?
如何消除 fmt.Println(x.Ident) 行的错误“x.Ident undefined(类型 ParentNode 没有字段或方法 Ident)”
最佳答案
它不会返回子结构。您正在做的是不对子结构进行类型转换,而只是返回其字段之一。举一个更具体的例子,上面的代码片段就像是尝试使用 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/