Golang返回子结构代替c+中的父结构+;

Golang返回子结构代替c+中的父结构+;,go,Go,我正在尝试一个通用函数,它可以返回多个子对象。其思想是能够返回请求json正文中的内容 代码如下 GenericType struct { V1 string `json:"v1"` V2 string `json:"v2"` } SubType struct { GenericType V3 string `json:"v3"` } func TestFunc() GenericType { val := SubType{ Gener

我正在尝试一个通用函数,它可以返回多个子对象。其思想是能够返回请求json正文中的内容

代码如下

GenericType struct {
    V1 string `json:"v1"`
    V2 string `json:"v2"`
}

SubType struct {
    GenericType
    V3 string `json:"v3"`
}

func TestFunc() GenericType {
    val := SubType{
        GenericType: GenericType{
            V1: "a",
            V2: "b",
        },
        V3: "c",
    }
    return val
}
错误是

cannot use val (type SubType) as type GenericType in return argument

是否可以在父指针中返回子体结构而不丢失该子体结构的字段,然后将其作为JSON对象返回到响应体中?

不能使用嵌入代替继承。不过,您可以使用接口来实现这一点。比如:

type Generic interface {
    V1() string
    V2() string
}

type parent struct {
    // ...
}

type child struct {
    // ...
}

// parent
func (p *parent) V1() string {
    return "parent V1"
}

func (p *parent) V2() string {
    return "parent V2"
}

// child
func (c *child) V1() string {
    return "child V1"
}

func (c *child) V2() string {
    return "child V2"
}

// further child methods

func NewGeneric() Generic {
    return &parent{}
    // or 
    // return &child{}
}

GO没有继承(如C++或java),但只有组合和接口。因此,函数只能返回一个类型结构(或指针)或接口。作为第一个近似值,您可以认为该接口几乎与C++中的纯抽象类相同)

在您的情况下,接口更好。现在,它取决于程序的其余部分如何处理返回的值。如果它需要调用几个方法(在go中,我们更喜欢只调用几个方法的接口,理想就是其中之一)

例如

但不幸的是,对于所有可以序列化为JSON的对象,我们没有任何公共方法(例如int、string或array),因此我们必须使用没有公共方法的接口-接口{}。

嵌入Go不允许继承(因为它不是继承)属性。当您将一个结构嵌入到另一个结构时,您正在将其“方法(而不是属性)组合到一个新组合中

Go没有提供典型的、类型驱动的子类化概念,但它确实能够通过在结构或接口中嵌入类型来“借用”实现的各个部分

接口 Go提供了很棒的接口来实现泛型类型和类型断言,以访问具体类型及其属性

:


因为Go不是一种面向对象的语言,所以不存在多态性。你可以使用的是@ Havelock,它不是真的,它有但多态性不同于C++中的多态性。
type GenericType interface {
    getV1() string
    getV2() string
}
type generic interface {
    say() string
}

type type1 struct {
    msg string
}

func (t type1) say() string {
    return t.msg
}

type type2 struct{}

func (t type2) say() string {
    return "I'm type 2"
}

func main() {
    t1 := type1{"Hey! I'm type1"}
    t2 := type2{}

    tl := []generic{t1, t2}

    for _, i := range tl {
        switch v := i.(type) {
        case type1:
            fmt.Println(v.say())
            fmt.Println(v.msg)
        case type2:
            fmt.Println(v.say())
            // fmt.Println(v.msg) Uncomment to see that type2 has no msg attribute.
        }
    }
}