繁体   English   中英

在 Golang 中传递结构类型?

[英]Passing a struct Type in Golang?

请原谅我的问题,我是 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)

为了减少重复,我决定我想做的是创建一个 function 来执行 JSON 解组,但将结构类型作为参数。

我浏览了几篇 StackOverflow 文章和 Google Groups 试图理解使用反射 package的一些答案,但我在使用它方面没有取得太大成功。

我最近的尝试是使用reflect.StructOf并传入一组StructField ,但这似乎仍然需要使用myReflectedStruct.Field(0)而不是myReflectedStruct.ID

怀疑在像 Generics 这样的东西在 Golang 中广泛使用之前可能没有办法。

我考虑了可能需要实现解组方法的结构的接口,然后我可以将该接口传递给 function 并调用解组方法。 但无论如何,我仍然在所有结构上实施解组。

我只是想知道有什么建议可以实现我所追求的,好吗?

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

func decode(r *http.Repsonse, v interface{}) error {
     return json.NewDecoder(res.Body).Decode(v)
}

使用指向您的事物的指针调用助手 function:

var tempThing SomeTypeIveDefined
err := deocde(r, &tempThing)

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

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 解码器将使用反射来设置结构字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM