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判断,不知道还没有没更好的解决办法

阅读 2.7k
2 个回答
这里,按理说会打印:

start
&{<nil>}
end

不。

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

这个问题怎么解决?

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

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

image.png

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题