Protobuf中set_name()与mutable_name()方法的适用场景解析
Protobuf中set_name()与mutable_name()的使用场景区分
用set_name()的情况
- 手里已经有现成的字符串值(不管是
const char*常量还是std::string变量),只想直接把这个值赋值给name字段时,直接用这个方法最省事。它内部会自动完成字符串的拷贝,不用你手动管内存。 - 示例代码:
// 直接传字符串常量 user.set_name("Charlie"); // 传std::string的C风格指针 std::string temp_name = "David"; user.set_name(temp_name.c_str());
用mutable_name()的情况
- 需要直接操作name字段对应的
std::string对象本身的时候,比如要在原有内容后面加字符、修改字符串长度、做替换这些操作,就用这个方法。它会返回指向内部std::string的指针,拿到指针后就能调用所有std::string的成员方法。 - 示例代码:
// 追加后缀 std::string* name_ptr = user.mutable_name(); name_ptr->append("_dev"); // 修改字符串长度 name_ptr->resize(8); - 补充:如果name字段之前没被赋值过,
mutable_name()会先创建一个空的std::string再返回指针;而set_name()则是直接把传入的值设置进去,不会提前初始化空字符串。
内容的提问来源于stack exchange,提问作者Sumo
相关产品推荐
相关产品推荐

