我的应用程序做了大量的 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)
...
- 1 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消