請原諒我的問題,我是 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 Groups,試圖理解有關使用反射包的一些答案,但我在使用它時并沒有取得太大的成功。
我最近的嘗試是使用reflect.StructOf并傳入一組StructFields,但這似乎仍然需要使用myReflectedStruct.Field(0)而不是myReflectedStruct.ID.
我懷疑在 Golang 中廣泛使用泛型之類的東西之前,可能沒有辦法。
我考慮過可能需要實作解組方法的結構的介面,然后我可以將介面傳遞給函式并呼叫解組方法。但無論如何,我仍然在所有結構上實施解組。
我只是想知道對于實作我所追求的目標有哪些建議?
uj5u.com熱心網友回復:
用重復的代碼創建一個輔助函式。將目標值作為指標傳遞。
func decode(r *http.Repsonse, v interface{}) error {
return json.NewDecoder(res.Body).Decode(v)
}
使用指向您的事物的指標呼叫輔助函式:
var tempThing SomeTypeIveDefined
err := deocde(r, &tempThing)
uj5u.com熱心網友回復:
您可以使用介面執行此操作:
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 解碼器將使用反射來設定結構欄位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400763.html
