抽象 GET、读取、解组逻辑

我的应用程序做了大量的 API 调用,我正在尝试摆脱围绕它的一些重复。从概念上讲,每次都重复以下步骤:

  1. 做一个GET请求

    1. 检查错误

  2. 阅读响应正文

    1. 检查错误

  3. 反序列化为目标结构

    1. 检查错误

  4. 返回目标结构

所有调用之间唯一显着的区别是目标结构。在代码中它看起来像这样:

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)

我感觉这应该是可能的......


婷婷同学_
浏览 140回答 1
1回答

LEATH

不要使用 的地址interface{},它已经包含解组所需的指针。func request(url string, target interface{}) (interface{}, error) {     // get response     err = json.Unmarshal(body, target)    ...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go