据我了解,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?
答案 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"}}