我正在嘗試使用泛型將 JSON 物件轉換為具有列舉的 GRPC 回應,即:
type GRPCResponse {
str string
enu EnumType
}
type EnumType int32
const (
Type1 EnumType = 0
Type2 EnumType = 1
)
解組的函式如下所示:
func assertHTTPResponseOK[T any](t *testing.T, endpoint string) T {
body, err := GetResponse(endpoint)
var v T
err := json.Unmarshal(body, &v)
require.Nil(t, err)
return v
}
呼叫它的代碼如下所示:
assertHTTPResponseOK[*GRPCResponse](t, "some-endpoint")
有問題的 JSON 物件如下所示:
{"str":"hello", "enu": "Type2"}
我收到以下錯誤:
json: cannot unmarshal string into Go struct field GRPCResponse.enu of type EnumType
從類似的問題中,我看到通常的建議是使用jsonpb.Unmarshalorprotojson.Unmarshal代替典型的json.Unmarshal.
在更改 Unmarshal 函式時,我還必須將 T 更改為protoreflect.ProtoMessage。但是,這阻止了我傳遞指向 to 的指標v,Unmarshal因為它是指向介面的指標,而不是介面。當然,我也不能傳入一個 nil 指標(不取 v 的地址)。
所以我的問題是:
- 有沒有辦法讓這個通用物件的指標滿足介面
protoreflect.ProtoMessage? - 是否有更好的解組功能更適合我的問題?
uj5u.com熱心網友回復:
我最終傳遞了我正在解組的物件。
obj := new(GRPCResponse)
assertHTTPResponseOK[*GRPCResponse](t, ctx, "some-endpoint", obj)
func assertHTTPResponseOK[T protoreflect.ProtoMessage](t *testing.T, ctx context.Context, endpoint string, object T) {
body, err := GetResponse(endpoint)
require.Nil(t, err)
err = protojson.Unmarshal(body, object)
require.Nil(t, err)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464411.html
