Golang返回子结构代替c+中的父结构+;
我正在尝试一个通用函数,它可以返回多个子对象。其思想是能够返回请求json正文中的内容 代码如下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
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.
}
}
}