第一篇:【缘起】
我写了这么一段代码:
代码语言:javascript复制RecommendResponse recommendResponse;
*(recommendResponse.recominfo().mutable_vecitem()) = {items.begin(), items.end()};
为了做一件事情,设置推荐响应的物品item的打分结果。(item在这个场景是广告app)。
本以为这样就安然无事,但是算法同学反馈我这边给了个空包,里面无一个item。从hdfs捞日志看响应包确实为空。
可能我对pb的读写有点误解。
首先我想到的是创造一个空响应,定义为RecommendResponse。
然后呢这个RecommendResponse在栈上应该会创建一个内嵌的结构体recominfo。
proto文件定义如下(为了方便阅读,裁掉不相干的内容):
代码语言:javascript复制message RecommendInfo{
repeated RecommendItem vecItem = 1;
}
message RecomResponse{
RecommendInfo recomInfo = 1;
}
于是我在recomInfo这个结构体实例上继续添加vecitem
那么根据mutalbe_vecitem规则,我应该这样添加。用大括号重载{},传入items(类型为std::vector)的begin()和end()迭代器。
代码语言:javascript复制 *(recom_response.recominfo().mutable_vecitem()) = {items.begin(), items.end()};
这样应该可以设置recommendResponse.recominfo(),那么这样recommendResponse也相应生成。
但是发现得用
代码语言:javascript复制*(recom_response.mutable_recominfo()->mutable_vecitem()) = {items.begin(), items.end()};这样应该可以设置recommendResponse.recominfo(),那么这样recommendResponse也相应生成。
这样才能生成recommendResponse这个结构体实例。
第二篇:【缘灭】
那么到底这个错误关键点上哪里呢,对mutable_机制理解不到位吗?