将结构转换为基类

时间:2018-09-02 03:51:52

标签: go

据我了解,golang中没有固有的多态性,那么如何从给定的结构中获取子结构?例如,结构A具有几个属性:

type A struct {
    a int
    b string
    c *float64
    d []byte
    e map[string]interface{}
}

我要删除e

type B struct {
    a int
    b string
    c *float64
    d []byte
}

那么除了将变量一个接一个地复制之外,还有什么方法可以将A转换为B?

1 个答案:

答案 0 :(得分:1)

您可以使用嵌入字段来实现。请参见Go Language Specification中的结构类型,例如:

  

字段名称可以显式指定(IdentifierList)或隐式指定(EmbeddedField)。

对于嵌入式字段,您可以将一个结构中的字段复制到该结构中,该结构是一个嵌入式字段,只需对该字段进行简单分配即可。

这是一个完整的可运行示例:

package main

import (
    "encoding/json"
    "fmt"
)

type Shared struct {
    Id   int
    Name string
}

type A struct {
    Count int
    Shared
}

type B struct {
    Color string
    Shared
}

func main() {
    shared := Shared{
        Id:   1,
        Name: "john",
    }
    a := A{
        Count:  5,
        Shared: shared,
    }
    b := B{
        Color: "green",
    }
    b.Shared = a.Shared
    c := map[string]interface{}{
        `a`: a,
        `b`: b,
    }
    msg, err := json.Marshal(c)
    if err != nil {
        fmt.Printf("Marshal error: %s\n", err)
    }
    fmt.Println(string(msg))
}

打印:

{"a":{"Count":5,"Id":1,"Name":"john"},"b":{"Color":"green","Id":1,"Name":"john"}}
相关问题