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

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

Golang:Unmarshal函數(shù),可以處理2種不同的結(jié)構(gòu)

Golang:Unmarshal函數(shù),可以處理2種不同的結(jié)構(gòu)

Go
慕標(biāo)琳琳 2022-08-24 20:10:16
尋求幫助。假設(shè)我有以下結(jié)構(gòu)。type phoneStruct struct {    PhoneID    string      `json:"id"`    Carrier      string    `json:"carrier"`}type carStruct struct {    CarID       string    `json:"id"`    Model       string    `json:"model"`}兩種截然不同的結(jié)構(gòu)。但可以預(yù)測?,F(xiàn)在在我的代碼中,我正在做的是執(zhí)行POST請求,然后解析我返回的內(nèi)容的主體,以便我可以對其進(jìn)行一些測試斷言。但為了簡單起見,假設(shè)我有這個JSON    var jsonPhone = `{            "id": "123",            "carrier": "Rogers"        }`    var jsonCar = `{            "id": "foobar-fewf-434-fewf",            "model": "Civic"        }`我想將這個json與我的結(jié)構(gòu)相關(guān)聯(lián),所以我有以下調(diào)用:p, err := parsePhone(jsonPhone)c, err := parseCar(jsonCar)這些函數(shù)看起來像這樣func parsePhone(body []byte) (*phoneStruct, error) {    var p = new(phoneStruct)    err := json.Unmarshal(body, p)    return p, err}func parseCar(body []byte) (*carStruct, error) {    var c = new(carStruct)    err := json.Unmarshal(body, c)    return c, err}..我想知道是否有一種方法可以只擁有一個結(jié)構(gòu)。我知道兩個或多個結(jié)構(gòu)之間是否存在一些共性?;蛘呷绾谓馕鑫粗Y(jié)構(gòu)。但是如果我知道結(jié)構(gòu),就無法找到資源。我怎么能有一個看起來像這樣的函數(shù)..func parseAnything(body []byte (<pointer to the struct>, error)    var c = new(someStruct)    err := json.Unmarshal(body, c)    return c, err}請注意,我將始終知道我在調(diào)用什么,因此我可以在我的解析函數(shù)中執(zhí)行條件開關(guān)語句,該語句顯示“if car..如果電話..'但我不確定如何定義回報。
查看完整描述

2 回答

?
子衿沉夜

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

編寫函數(shù)以獲取指向結(jié)果的指針:


func parseAnything(body []byte, c interface{}) error {

    return json.Unmarshal(body, c)

}

像這樣使用它:


var p phoneStruct

if err := parseAnything(jsonPhone, &p); err != nil {

    // handle error

}

// p has unmarshaled phone


var c carStruct

if err := parseAnything(jsonCar, &c); err != nil {

   // handle error

}

// c has unmarshaled car


查看完整回答
反對 回復(fù) 2022-08-24
?
慕村225694

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

我不知道你到底想建立什么,但會嘗試根據(jù)我的理解提供一些見解。


如果您嘗試對兩個結(jié)構(gòu)使用相同的解析器,則它們可能有一些共同點(diǎn)。可能它們被一起用于您應(yīng)用程序的某些用例。


因此,如果它們一起使用,它們應(yīng)該實(shí)現(xiàn)一些接口,這些接口表示這些結(jié)構(gòu)具有共同的特征集(可能與數(shù)據(jù)解析有關(guān),也可能不相關(guān))。


而且,正如你所說,你事先知道你需要什么類型的結(jié)構(gòu),所以這樣做應(yīng)該很容易:


//The interface that represents what the structs have in common. 

//I named it "Parser" because it's the info I have. It probably should have another (better) name

type Parser interface {

  Parse([]byte) (Parser, error)

}


type Phone struct {

    PhoneID    string      `json:"id"`

    Carrier      string    `json:"carrier"`

}


type Car struct {

    CarID       string    `json:"id"`

    Model       string    `json:"model"`

}


func (p *Phone) Parse (body []byte) (Parser, error) {

    err := json.Unmarshal(body, p)

    return p, err

}


func (c *Car) Parse (body []byte) (Parser, error) {

    err := json.Unmarshal(body, c)

    return c, err

}



func main() {

    c := Car{}

    var jsonCar = `{

            "id": "123",

            "model": "Civic"

        }`


    res, _ := c.Parse([]byte(jsonCar))

    fmt.Println(res)


    p := Phone{}

    var jsonPhone = `{

            "id": "123",

            "carrier": "Rogers"

        }`


    res, _ = p.Parse([]byte(jsonPhone))

    fmt.Println(res)      

  

}


查看完整回答
反對 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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