H5W3
当前位置:H5W3 > go > 正文

【go】protocol生成的结构体的问题

golang里protocol生成的pb代码:

type Obj struct {
Foo *Foo `protobuf:"bytes,1,opt,name=foo,proto3" json:"foo,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}

下面是问题

/*
这里,按理说会打印:
start
&{<nil>}
end
但是什么也没打印出来
start
end
*/
fmt.Println("start")
fmt.Println(new(Obj))
fmt.Println("end")

本来没有发现这个问题的,直到不小心传进来一个错误的数据才发现,

jsonStr="{\"key\":\"value\"}"
request:=new(Obj)
err := json.Unmarshal([]byte(jsonStr), request)
if err!=nil {
//json.Unmarshal没有报错,err是nil
fmt.Println(err)
}
//request仍旧什么都没有
fmt.Println(request)

这个问题怎么解决?
最后加了个len(request转字符串)==0判断,不知道还没有没更好的解决办法

这里,按理说会打印:
start
&{<nil>}
end

不。

new 生成的新对象是 zero value。Foo 是指针,它的 zero value 是 nil,而不是 &Foo{} 。打印的时候自然没有输出。

这个问题怎么解决?

你想解决成什么样子?只是 fmt.Println 嘛?

其实protobuffer go版本生成的结构是可以解析json格式的数据的,所以你的用法并没有错。你看后面的struct tag其实有json部分:

【go】protocol生成的结构体的问题

这个并不能算是一个错误,这个go protobuf的一个特性。

回答

本文地址:H5W3 » 【go】protocol生成的结构体的问题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址