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

在 Golang 中传递结构类型?

在 Golang 中传递结构类型?

Go
ABOUTYOU 2022-10-24 09:56:06
请原谅我的问题,我是 Golang 的新手,可能有错误的方法。我目前正在为内部服务实施 Terraform 提供程序。正如预期的那样,这需要将 JSON 数据解组为预定义的结构类型,例如:type SomeTypeIveDefined struct {    ID   string `json:"id"`    Name String `json:"name"`}我让自己陷入了这样一种情况,我有很多重复的代码,看起来像这样    res := r.(*http.Response)    var tempThing SomeTypeIveDefined    dec := json.NewDecoder(res.Body)    err := dec.Decode(&tempThing)为了减少重复,我决定我想做的是创建一个函数来进行 JSON 解组,但将 Struct Type 作为参数。我浏览了几篇 StackOverflow 文章和 Google Groups 试图理解使用反射包的一些答案,但我在使用它方面并没有取得太大的成功。我最近的尝试是使用reflect.StructOf并传入一组StructFields,但这似乎仍然需要使用myReflectedStruct.Field(0)而不是myReflectedStruct.ID.我怀疑在诸如泛型之类的东西在 Golang 中广泛使用之前可能没有办法。我考虑了可能需要实现解组方法的结构的接口,然后我可以将接口传递给函数并调用解组方法。但无论如何,我仍然在所有结构上实施解组。我只是想知道有什么建议可以实现我所追求的,好吗?
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

使用重复的代码创建一个辅助函数。将目标值作为指针传递。


func decode(r *http.Repsonse, v interface{}) error {

     return json.NewDecoder(res.Body).Decode(v)

}

使用指向您事物的指针调用辅助函数:


var tempThing SomeTypeIveDefined

err := deocde(r, &tempThing)


查看完整回答
反对 回复 2022-10-24
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您可以使用接口执行此操作:


func decodeResponse(r *http.Response, dest interface{}) error {

    dec := json.NewDecoder(r.Body)

    return dec.Decode(dest)

}


func handler(...) {

    res := r.(*http.Response)

    var tempThing SomeTypeIveDefined

    if err:=decodeResponse(res,&tempThing); err!=nil {

      // handle err

    }

   ...

}

您不需要为结构实现解组,因为 stdlib 解码器将使用反射来设置结构字段。


查看完整回答
反对 回复 2022-10-24
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

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