将struct转换为基类

问题描述 投票:-1回答:1

根据我的理解,golang中没有固有的和多态的,所以如何从给定的结构中获取子结构?例如,struct 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?

go
1个回答
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"}}
© www.soinside.com 2019 - 2024. All rights reserved.