第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 []struct 中追加不需要的類型

在 []struct 中追加不需要的類型

Go
森林海 2021-11-22 18:18:14
我正在學(xué)習(xí)去和卡住的結(jié)構(gòu)我需要生成json:{    "and" : [        { "term" : { "name.second" : "ba" } }      ]    }  }所以我可以用代碼做到這一點:package mainimport (  "encoding/json"  "fmt")type Term map[string]interface{}type TermHash struct {  Term `json:"term"`}type Filter struct {        And []TermHash `json:"and"`}func main() {  var filter Filter  filter.And = append(filter.And, TermHash{ Term{"name.second" : "ba"}})  jsonFilter, _ := json.MarshalIndent(filter, "", "   ")  fmt.Printf(string(jsonFilter))}但我真的不想使用單獨的 TermHash 和 Term 類型,它在代碼中似乎沒有必要,僅用于添加此行進(jìn)行過濾。我可以避免使用它嗎?我只想用類型過濾器來完成這個:type Filter struct {  And []struct{    Term map[string]interface{} `json:"term"`  } `json:"and"`}這看起來更具可讀性并代表預(yù)期的結(jié)果,但我無法以這種方式創(chuàng)建 Term 的實例。有沒有辦法在不創(chuàng)建單獨類型的情況下向 json 添加條款行?
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗 獲得超7個贊

您真正想要的是 JSON 編碼的自定義方式Term。它不是一個簡單的地圖,而是像一個包含地圖的對象一樣進(jìn)行編組。所以,讓我們MarshalJSON為它編寫這個習(xí)慣:


type Term map[string]interface{}


func (t Term) MarshalJSON() ([]byte, error) {

    return json.Marshal(struct {

        T map[string]interface{} `json:"term"`

    }{t})

}

我們struct在這里創(chuàng)建一個匿名的,用我們自己填充,然后將其編組為 JSON。注意map[string]interface{}這里的使用。雖然看起來像Term,但它實際上是一種不同的類型,具有自己的 JSON 編碼方式。如果您嘗試在此處保存一些輸入并使用T Term,您會發(fā)現(xiàn)自己處于無限循環(huán)中。(創(chuàng)建與其他類型具有相同結(jié)構(gòu)的新類型的想法是 Go 的主要部分。)


現(xiàn)在我們的數(shù)據(jù)結(jié)構(gòu)很簡單;只是一部分術(shù)語:


type Filter struct {

    And []Term `json:"and"`

}


func main() {

    var filter Filter

    filter.And = append(filter.And, Term{"name.second" : "ba"})

    jsonFilter, _ := json.MarshalIndent(filter, "", "   ")

    fmt.Printf(string(jsonFilter))

}

也就是說,您也可以走另一條路,讓您的數(shù)據(jù)模型與 JSON 更緊密地匹配。在那種情況下Term應(yīng)該是一個結(jié)構(gòu),而不是一個地圖。你可能會這樣寫:


type Term struct {

    Values map[string]interface{} `json:"term"`

}


func NewTerm(key, value string) Term {

    return Term{map[string]interface{}{key: value}}

}


type Filter struct {

    And []Term `json:"and"`

}


func main() {

    var filter Filter

    filter.And = append(filter.And, NewTerm("name.second", "ba"))

    jsonFilter, _ := json.MarshalIndent(filter, "", "   ")

    fmt.Printf(string(jsonFilter))

}


查看完整回答
反對 回復(fù) 2021-11-22
?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊

您可以圍繞它創(chuàng)建一個包裝函數(shù)。


package main


import (

    "fmt"

    "encoding/json"

)


type Filter struct {    

    And    []map[string]interface{}  `json:"and"`

}


func WrapFilter(i interface{}) Filter {

    return Filter{

        And: []map[string]interface{}{

            map[string]interface{}{

                "term": i,

            },

        },

    }

}


func main() {


    f := WrapFilter(map[string]string{"name.second": "ba"}) 

    json.Marshal(f) 


}

這樣,您將始終"term"在編組的 JSON 中擁有二級密鑰。


查看完整回答
反對 回復(fù) 2021-11-22
  • 2 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號