go - 如何让 golang 中的解码函数处理多种类型?

标签 go types polymorphism

我在 golang 中使用 json.unmarshalling 函数来解码我们从 API 获得的一些 JSON 响应。如何让它处理多种类型?

我们收到的响应总是状态码和消息,只是json字段有不同的名字。这两个字段有时称为code和message,有时称为statuscode和description,这取决于我们查询的内容。

假设我们查询 Apple,这可以通过创建一个 Apple 类型结构简单地解决,如下所示:

type Apple struct {
    Code        int    `json:"code"`
    Description string `json:"message"`
}

但是当我们查询Peach时,我们得到的json不再是code和message了,字段名变成了statuscode和description。所以我们需要以下内容:

type Peach struct {
    Code        int    `json:"statuscode"`
    Description string `json:"description"`
}

潜在地,我们需要再设置 50 种类型并重复写入 50 次??必须有更好的方法来做到这一点。不幸的是,我是 Golang 的新手,不知道多态性在这种语言中是如何工作的。请帮忙。

最佳答案

据我所知,您应该始终解码为结构以从 go static 类型、附加到该结构的方法中获益,并且也许能够使用像 validator 这样的包来验证您的响应。 ,但您始终可以将 JSON 正文解析为这样的映射:

// JsonParse parses the json body of http request
func JsonParse(r *http.Request) (map[string]interface{}, error) {
    // Read the r.body into a byte array
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        return nil, err
    }
    // Make a map of String keys and Interface Values
    b := make(map[string]interface{})
    // Unmarshal the body array into the map
    err = json.Unmarshal(body, &b)
    if err != nil {
        return nil, err
    }
    return b, nil
}

关于go - 如何让 golang 中的解码函数处理多种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57047941/

相关文章:

c++ - 接口(interface)方法的实现

go - 关于从函数返回指针的问题

language-agnostic - 我应该使用像 IEnumerable 这样的接口(interface),还是像 List<> 这样的具体类

reactjs - 无法加载 http ://localhost:3000/js/app. jsx

matlab - 如何查看表中每个列的数据类型

types - Julia 类型的问题

java - org.jooq.Query.getBindValues() 返回的 List<Object> 是否包含每个查询参数的类型安全对象?

c++ - 何时更喜欢基于模板策略的设计而不是基于非模板继承的设计

go - 在 go 中读取 cookie 的最短、准确且跨浏览器兼容的方法是什么?

在 go lang 中转换为结构类型