簡體   English   中英

如何在Golang中合並兩個結構?

[英]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"
}

您可以將兩個結構嵌入另一個結構中

type name struct {
    Name string `json:"name"`
}

type description struct {
    Description string `json:"description"`
}

type combined struct {
    name
    description
}

JSON包會像對待聯合一樣對待嵌入式結構,但這會很快變得笨拙。

這有點令人費解,但我想您可以做這樣的事情:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM