3 回答

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

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
grpc 不推薦使用點(diǎn)域,如果你堅(jiān)持使用指針
一種方法是使用反射來轉(zhuǎn)換它
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貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
你不能設(shè)置空值而不是你可以使用
oneof Examples {
Example1 example1 = 1;
Example2 example2 = 2;
}
當(dāng)你使用 oneof 時(shí),你必須只設(shè)置一個(gè)值,你可以設(shè)置 example1 或 example2 你不能同時(shí)使用兩者。與設(shè)置 nil 值相比,這將解決您的問題。
方法二:
默認(rèn)情況下,gRPC 的所有變量都具有初始值 ex: string: ""
您還可以做的一件事是不要設(shè)置 nil 值檢查條件,如果您的值為 nil,則什么都不設(shè)置。
- 3 回答
- 0 關(guān)注
- 385 瀏覽
添加回答
舉報(bào)