請原諒我的問題,我是 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)

慕無忌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 解碼器將使用反射來設置結構字段。
- 2 回答
- 0 關注
- 128 瀏覽
添加回答
舉報
0/150
提交
取消