3 回答

TA貢獻1844條經驗 獲得超8個贊
如果協議緩沖區消息的字段可以為 nil,則由您檢查它們。對此你無能為力,除非有一個實用程序包可以做到這一點。
如果您希望默認值高于和超出協議緩沖區生成的默認值,則必須完全按照您的記錄進行操作并檢查是否為 nil。
我確實有一些問題:
為什么對第一個用戶結構中的“可選”字段使用指針?如果您使用普通的舊字符串,它們將在構造時填充空字符串,并且如果該字段丟失,則不會被 json unmarshal 調用觸及。時間字段也一樣。在這種情況下,字符串的默認值(空字符串)應該是無效的中間名,時間的默認值 (0001-01-01 00:00:00 +0000 UTC) 是無效的時間戳(可能?)。擺脫指針允許您使用默認值。
對于原型結構中的時間戳,您仍然可以使用字符串并檢查空字符串?;蛘吣梢允褂?google.protobuf.Timestamp 并使用 ptypes 來處理與非原型結構之間的轉換。

TA貢獻1817條經驗 獲得超14個贊
grpc 不推薦使用點域,如果你堅持使用指針
一種方法是使用反射來轉換它
func ToGrpcData(in, out interface{}) error {
inVal := reflect.ValueOf(in)
if inVal.Kind() == reflect.Ptr {
inVal = inVal.Elem()
}
inTyp := inVal.Type()
outVal := reflect.ValueOf(out)
if outVal.Kind() != reflect.Ptr {
return errors.New("out data must be point value")
}
outVal = outVal.Elem()
outTyp := outVal.Type()
strWrapperType := reflect.TypeOf(wrappers.StringValue{})
// range all 'in' fields
for i := 0; i < inVal.NumField(); i++ {
fTyp := inTyp.Field(i)
fVal := inVal.Field(i)
if fTyp.Type.Kind() == reflect.Ptr {
switch fTyp.Type.Elem().Kind() {
case reflect.String: // only implement string in this test
oFTyp, ok := outTyp.FieldByName(fTyp.Name)
if ok == false {
return errors.New("not match field in out value")
}
if oFTyp.Type.Elem() != strWrapperType {
return errors.New("not match field in out value")
}
if fVal.IsNil() == false {
outVal.FieldByName(fTyp.Name).Set(
reflect.ValueOf(&wrappers.StringValue{
Value: fVal.Elem().String(),
}),
)
}
}
} else {
outVal.FieldByName(fTyp.Name).Set(fVal)
}
}
return nil
}
用法
type User struct {
Name string
Value *string
}
type ServerUser struct {
Name string
Value *wrappers.StringValue
}
usValue := "123"
u1 := User{
Name: "tom",
Value: &usValue,
}
u2 := ServerUser{}
err := ToGrpcData(&u1, &u2)
// error process ...
fmt.Println(u2)

TA貢獻1936條經驗 獲得超7個贊
你不能設置空值而不是你可以使用
oneof Examples {
Example1 example1 = 1;
Example2 example2 = 2;
}
當你使用 oneof 時,你必須只設置一個值,你可以設置 example1 或 example2 你不能同時使用兩者。與設置 nil 值相比,這將解決您的問題。
方法二:
默認情況下,gRPC 的所有變量都具有初始值 ex: string: ""
您還可以做的一件事是不要設置 nil 值檢查條件,如果您的值為 nil,則什么都不設置。
- 3 回答
- 0 關注
- 349 瀏覽
添加回答
舉報