[英]How can I merge two structs in Golang?
我有兩個json-marshallable匿名結構。
a := struct {
Name string `json:"name"`
}{"my name"}
b := struct {
Description string `json:"description"`
}{"my description"}
有什么方法可以將它們合並到json中以獲得類似的信息:
{
"name":"my name",
"description":"my description"
}
這有點令人費解,但我想您可以做這樣的事情:
a := struct {
Name string `json:"name"`
}{"my name"}
b := struct {
Description string `json:"description"`
}{"my description"}
var m map[string]string
ja, _ := json.Marshal(a)
json.Unmarshal(ja, &m)
jb, _ := json.Marshal(b)
json.Unmarshal(jb, &m)
jm, _ := json.Marshal(m)
fmt.Println(string(jm))
您可以像這樣合並兩個結構:
package main
import (
"fmt"
"encoding/json"
)
type b struct {
Name string `json:"name"`
Description string
Url string
}
type a struct {
*b
MimeType string `json:"mimeType"`
}
func main() {
bc := b{"test", "testdecription", "testurl"}
ac := a{nil, "jpg"}
ac.b = &bc
js, _ := json.Marshal(ac)
fmt.Println(string(js) )
}
Go完全是關於繼承而不是繼承。 可悲的是,您使用的是匿名結構,但鑒於您顯然試圖對它們進行json封送處理,因此最好將它們定義為類型:
type name struct {
Name string `json:"name"`
}
type desc struct {
Description string `json:"description"`
}
您可以使用與當前相同的方式對其進行初始化,但是您只需編寫即可代替struct{<fields>}{init}
a := name{"foo"}
b := desc{"Description"}
然后,您可以通過以下方式以任意方式組合它們:
c := struct {
name
description
}{a, b}
編寫此類成員時,您必須習慣一個怪癖(起初可能會使您失望)。 假設您決定創建一個結合其他兩個結構的類型:
type foo struct {
name
description
}
您不能像這樣初始化它:
o := foo{"Name value", "description value"}
Go會抱怨您使用type string作為type name
。 您必須編寫如下內容:
o := foo{
name{"Name value"},
description{Description: "Description val"},//optional with field names
}
使用現有對象(參見c := struct{}{a, b}
)構建的嵌入式組合已經做到了。
根據您要執行的操作,有時編寫這樣的內容有時會更容易:
func (s *MyCompositeType) CopyName(n name) {
s.Name = n.Name
//copy other fields
}
當您將復合類型嵌套到多個級別時,它使工作變得更輕松。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.