为了账号安全,请及时绑定邮箱和手机立即绑定

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"`}两种截然不同的结构。但可以预测。现在在我的代码中,我正在做的是执行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}..我想知道是否有一种方法可以只拥有一个结构。我知道两个或多个结构之间是否存在一些共性。或者如何解析未知结构。但是如果我知道结构,就无法找到资源。我怎么能有一个看起来像这样的函数..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个赞

我不知道你到底想建立什么,但会尝试根据我的理解提供一些见解。


如果您尝试对两个结构使用相同的解析器,则它们可能有一些共同点。可能它们被一起用于您应用程序的某些用例。


因此,如果它们一起使用,它们应该实现一些接口,这些接口表示这些结构具有共同的特征集(可能与数据解析有关,也可能不相关)。


而且,正如你所说,你事先知道你需要什么类型的结构,所以这样做应该很容易:


//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 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号