【问题标题】:Golang: when typecasting child struct to parent struct, is child struct information lost?Golang:将子结构类型转换为父结构时,子结构信息是否丢失?
【发布时间】:2016-02-16 09:56:04
【问题描述】:

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

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 结构向上转换为父结构,但将其作为子结构进行操作。有没有办法使用接口解决这个问题?

如何消除fmt.Println(x.Ident) 行的错误“x.Ident undefined (type ParentNode has no field or method Ident)”

【问题讨论】:

    标签: inheritance struct go subclass


    【解决方案1】:

    它不会返回子结构。您正在做的是对子结构进行类型转换,而只是返回其中一个字段。举一个更具体的例子,上面的 go sn-p 就像尝试使用 Employee 的名称,就好像它是 Employee 的超类一样。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多