我的应用程序做了大量的 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)
我感觉这应该是可能的......
LEATH
相关分类