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

抽象 GET、读取、解组逻辑

抽象 GET、读取、解组逻辑

Go
婷婷同学_ 2021-09-10 17:08:12
我的应用程序做了大量的 API 调用,我正在尝试摆脱围绕它的一些重复。从概念上讲,每次都重复以下步骤:做一个GET请求检查错误阅读响应正文检查错误反序列化为目标结构检查错误返回目标结构所有调用之间唯一显着的区别是目标结构。在代码中它看起来像这样:func getUsers() ([]User, error) {    resp, err := http.Get(someUrl)    if err != nil {        return nil, err     }    if resp.StatusCode != 200 {        return nil, errors.New("Search return non 200 status code")    }    defer resp.Body.Close()    body, err := ioutil.ReadAll(resp.Body)    if err != nil {        return nil, err     }    var users []User // This is the only real difference!    err = json.Unmarshal(body, &users)    if err != nil {        return nil, err     }    return users, nil }我很想做类似getUsers(url, users)和的事情getProjects(url, projects)。我一直在尝试使用一个函数,它接受 ainterface{}并稍后再次将其转换为正确的类型,但无济于事:func request(url string, target interface{}) (interface{}, error) {     // do all the same logic as above. Except:     err = json.Unmarshal(body, &target)     // ...     return target, nil}然后执行以下操作: var users []User result, err := request(url, users) v, ok := result.([]User)我感觉这应该是可能的......
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

不要使用 的地址interface{},它已经包含解组所需的指针。


func request(url string, target interface{}) (interface{}, error) {

     // get response

     err = json.Unmarshal(body, target)

    ...


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信