亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Golang:Unmarshal函數,可以處理2種不同的結構

Golang:Unmarshal函數,可以處理2種不同的結構

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

2 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

編寫函數以獲取指向結果的指針:


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


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

TA貢獻1880條經驗 獲得超4個贊

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


如果您嘗試對兩個結構使用相同的解析器,則它們可能有一些共同點??赡芩鼈儽灰黄鹩糜谀鷳贸绦虻哪承┯美?/p>


因此,如果它們一起使用,它們應該實現一些接口,這些接口表示這些結構具有共同的特征集(可能與數據解析有關,也可能不相關)。


而且,正如你所說,你事先知道你需要什么類型的結構,所以這樣做應該很容易:


//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)      

  

}


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號