在 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)
为了减少重复,我决定我想做的是创建一个函数来执行 JSON 解组,但将结构类型作为参数。
我浏览了几篇 Whosebug 文章和 Google 组,试图弄清有关使用 reflect package 的一些答案,但我在使用它方面没有取得多大成功。
我最近的尝试是使用 reflect.StructOf
并传入一组 StructField
,但这似乎仍然需要使用 myReflectedStruct.Field(0)
而不是 myReflectedStruct.ID
。
我 怀疑 在 Golang 中广泛使用泛型之类的东西之前可能没有办法。
我考虑过可能需要实现解组方法的结构接口,然后我可以将接口传递给函数并调用解组方法。但是无论如何我仍然在所有结构上实施解组。
我只是想知道有什么建议可以实现我所追求的目标,好吗?
您可以使用接口执行此操作:
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 解码器将使用反射来设置结构字段。
用重复的代码创建一个辅助函数。将目标值作为指针传递。
func decode(r *http.Repsonse, v interface{}) error {
return json.NewDecoder(res.Body).Decode(v)
}
使用指向您的事物的指针调用辅助函数:
var tempThing SomeTypeIveDefined
err := deocde(r, &tempThing)
请原谅我的问题,我是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 解组,但将结构类型作为参数。
我浏览了几篇 Whosebug 文章和 Google 组,试图弄清有关使用 reflect package 的一些答案,但我在使用它方面没有取得多大成功。
我最近的尝试是使用 reflect.StructOf
并传入一组 StructField
,但这似乎仍然需要使用 myReflectedStruct.Field(0)
而不是 myReflectedStruct.ID
。
我 怀疑 在 Golang 中广泛使用泛型之类的东西之前可能没有办法。
我考虑过可能需要实现解组方法的结构接口,然后我可以将接口传递给函数并调用解组方法。但是无论如何我仍然在所有结构上实施解组。
我只是想知道有什么建议可以实现我所追求的目标,好吗?
您可以使用接口执行此操作:
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 解码器将使用反射来设置结构字段。
用重复的代码创建一个辅助函数。将目标值作为指针传递。
func decode(r *http.Repsonse, v interface{}) error {
return json.NewDecoder(res.Body).Decode(v)
}
使用指向您的事物的指针调用辅助函数:
var tempThing SomeTypeIveDefined
err := deocde(r, &tempThing)