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

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

gRPC 可能出現(xiàn)零服務(wù)器消息嗎?

gRPC 可能出現(xiàn)零服務(wù)器消息嗎?

Go
白豬掌柜的 2023-06-19 14:12:02
在下面的gRPC客戶端代碼中,第二個(gè)是if必要的嗎?status, err := cli.GetStatus(ctx, &empty.Empty{})if err != nil {    return err}if status == nil {    // this should NEVER happen - right?    return fmt.Errorf("nil Status result returned") }go 直覺上,為了以防萬一,應(yīng)該總是檢查 nil 。但是,有一個(gè)運(yùn)行時(shí)檢查來捕獲任何客戶端到服務(wù)器的nil使用,例如status, err := cli.GetStatus(ctx, nil) // <- runtime errorif err != nil {    // "rpc error: code = Internal desc = grpc: error while marshaling: proto: Marshal called with nil"    return err}那么是否有類似的服務(wù)器到客戶端運(yùn)行時(shí)保證,從而消除檢查的需要status == nil?
查看完整描述

2 回答

?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

使用人為的服務(wù)器示例進(jìn)一步調(diào)查:


func (s *mygRPC) GetStatus(context.Context, *empty.Empty) (*pb.Status, error) {

? ? log.Println("cli: GetStatus()")


? ? //return &pb.Status{}, nil

? ? return nil, nil // <- can server return a nil status message (with nil error)

}

并測試客戶端/服務(wù)器的反應(yīng):


客戶:


ERROR: rpc error: code = Internal desc = grpc: error while marshaling: proto: Marshal called with nil

服務(wù)器:


2019/05/14 16:09:50 cli: GetStatus()

ERROR: 2019/05/14 16:09:50 grpc: server failed to encode response:? rpc error: code = Internal desc = grpc: error while marshaling: proto: Marshal called with nil

因此,即使想要合法地返回一個(gè) nil 值,gRPC傳輸也不會(huì)允許。


注意:服務(wù)器端代碼仍在執(zhí)行 - 正如預(yù)期的那樣 - 但就客戶端而言,調(diào)用gRPC失敗了。


結(jié)論:有效的 ( err==nil) 服務(wù)器響應(yīng)將始終返回有效的 ( 非nil) 消息。


編輯:


檢查源代碼可以揭示捕獲消息的gRPC位置:nil


服務(wù)器.go

func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options, comp encoding.Compressor) error {

? ? data, err := encode(s.getCodec(stream.ContentSubtype()), msg)

? ? if err != nil {

? ? ? ? grpclog.Errorln("grpc: server failed to encode response: ", err)

? ? ? ? return err

? ? }

? ? // ...

}

rpc_util.go

func encode(c baseCodec, msg interface{}) ([]byte, error) {

? ? if msg == nil { // NOTE: typed nils will not be caught by this check

? ? ? ? return nil, nil

? ? }

? ? b, err := c.Marshal(msg)

? ? if err != nil {

? ? ? ? return nil, status.Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error())

? ? }

? ? // ...

}

這一行的評(píng)論是關(guān)鍵:


if msg == nil { // NOTE: typed nils will not be caught by this check }

因此,如果要對(duì)我們的 typed-nil 使用 reflect,reflect.ValueOf(msg).IsNil()將返回true. 以下c.Marshal(msg)錯(cuò)誤 - 調(diào)用無法向客戶端發(fā)送消息響應(yīng)。


查看完整回答
反對(duì) 回復(fù) 2023-06-19
?
小唯快跑啊

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊

是的,這永遠(yuǎn)不應(yīng)該發(fā)生。GRPC 對(duì)此負(fù)責(zé)。



查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 2 回答
  • 0 關(guān)注
  • 161 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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