【发布时间】:2022-01-02 02:48:37
【问题描述】:
请原谅我的问题,我是 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 解组,但将结构类型作为参数。
我翻阅了几篇 StackOverflow 文章和 Google 群组,试图了解有关使用 reflect package 的一些答案,但我在使用它方面没有取得太大成功。
我最近的尝试是使用reflect.StructOf 并传入一组StructFields,但这似乎仍然需要使用myReflectedStruct.Field(0) 而不是myReflectedStruct.ID。
我怀疑在像泛型这样的东西在 Golang 中广泛使用之前可能没有办法。
我考虑了可能需要实现解组方法的结构的接口,然后我可以将接口传递给函数并调用解组方法。但无论如何,我仍在对所有结构实施解组。
我只是想知道有什么建议可以帮助我实现我的目标?
【问题讨论】:
-
您所描述的功能如何减少重复?我想不出比单线
json.NewDecoder(res.Body).Decode(&tempThing)更小的版本。您能否为您正在寻找的假设函数提供示例函数签名? -
@maxm:所以这个问题在某种程度上被简化了,希望它更容易理解和回答。但是解组发生在一个更大的方法中(我没有提到),它也减少了其他重复。但就这个更人为的例子而言,你是对的。从表面上看,它具有边际收益。
-
“为了减少重复,”坏主意。 “我决定我想做的是创建一个执行 JSON 解组的函数,但将结构类型作为参数。”你不能那样做。
-
@Volker 我很好奇你为什么减少重复是一个坏主意。根据我的专业经验,如果有明确的重复,则不重复代码是常见的做法。当然,早期的抽象是一件坏事。就我而言,我有无数完全相同的代码示例。您介意详细说明什么是坏主意吗?
标签: json go reflection unmarshalling