第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

grpc-go 模型中的空值問題

grpc-go 模型中的空值問題

Go
絕地?zé)o雙 2023-06-12 17:25:46
我有兩臺(tái)服務(wù)器用戶服務(wù)器:處理所有用戶增刪改查操作產(chǎn)品服務(wù)器:處理產(chǎn)品 CRUD 操作并通過 gRPC 調(diào)用從用戶服務(wù)器獲取用戶信息type User struct {    ID string `json:"id"`    FirstName      string     `json:"firstName"`    MiddleName     *string    `json:"middleName,omitempty"`    LastName       string     `json:"lastName"`    Email          string     `json:"email"`    Disabled       bool       `json:"disabled"`    LastSignedInAt *time.Time `json:"lastSignedInAt,omitempty"`    Bio            *string    `json:"bio,omitempty"`    BirthDate      *time.Time `json:"birthDate,omitempty"`}這里有些字段是可選的,因?yàn)槲沂褂玫氖?cockroachDB(擴(kuò)展的 postgreSQL),所以我將它們保存為指針,以便掃描可變形式的查詢結(jié)果很容易。這是我的原型文件:message User {    int64 id = 1;    string firstName = 2;    string lastName = 3;    string email = 5;    bool disabled = 6;    string lastSignedInAt = 8;    string bio = 9;    string birthdate = 10;    string profession = 14;}現(xiàn)在從上面的原型文件生成的模型是這樣的:“type User struct {    Id                   int64                 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`    FirstName            string                `protobuf:"bytes,2,opt,name=firstName,proto3" json:"firstName,omitempty"`    LastName             string                `protobuf:"bytes,3,opt,name=lastName,proto3" json:"lastName,omitempty"`    Email                string                `protobuf:"bytes,4,opt,name=email,json=email,proto3" json:"email,omitempty"`    Disabled             bool                  `protobuf:"varint,6,opt,name=disabled,proto3" json:"disabled,omitempty"`}現(xiàn)在的問題是,因?yàn)槲艺跒榭蛇x字段使用指針,它會(huì)在沒有值的情況下存儲(chǔ)空值,但在對(duì)面的站點(diǎn)上,gRPC 不會(huì)理解空值并拋出錯(cuò)誤。我試過google.protobuf.StringValue像這樣將值作為 grpc 類型google.protobuf.StringValue lastSignedInAt = 8;這可行,但問題是我必須為處理程序中的每個(gè)字段編寫條件:if lastSignedInAt != nil {    user.LastSignedInAt = &wrappers.StringValue{Value:*lastSignedInAt}}解決這個(gè)問題的最佳方法是什么?我應(yīng)該更改數(shù)據(jù)庫模型還是 gRPC 模型中的任何更改?
查看完整描述

3 回答

?
婷婷同學(xué)_

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)換。


查看完整回答
反對(duì) 回復(fù) 2023-06-12
?
大話西游666

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)


查看完整回答
反對(duì) 回復(fù) 2023-06-12
?
LEATH

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è)置。


查看完整回答
反對(duì) 回復(fù) 2023-06-12
  • 3 回答
  • 0 關(guān)注
  • 385 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)