深圳做响应式网站制作怎样做网站系统

张小明 2025/12/30 20:12:44
深圳做响应式网站制作,怎样做网站系统,168分类信息发布网,电商设计一般都是做什么最近团队内做 Code Review 时#xff0c;发现很多小伙伴对 Protobuf 的赋值方法一脸懵#xff0c;踩坑的次数多了#xff0c;索性今天把 Protobuf 里 set、add、mutable 这些核心赋值方式整理清楚#xff0c;帮大家少走弯路。 先说明下#xff0c;本文基于 Protobuf 3.x发现很多小伙伴对 Protobuf 的赋值方法一脸懵踩坑的次数多了索性今天把 Protobuf 里 set、add、mutable 这些核心赋值方式整理清楚帮大家少走弯路。先说明下本文基于 Protobuf 3.x目前主流版本如果还在用 2.x 的小伙伴注意下required/optional的差异即可核心用法基本一致。先搭个基础定义一个示例 Proto聊用法前先定义一个简单的 Proto 文件作为示例后面所有代码都基于这个结构大家看起来更直观// user.proto syntax proto3; // 声明protobuf版本 // 订单消息 message Order { int64 order_id 1; // 订单ID string product_name 2; // 商品名 double price 3; // 价格 } // 用户消息 message User { int64 id 1; // 单值基本类型整型 string name 2; // 单值基本类型字符串 bool is_vip 3; // 单值基本类型布尔 Order default_order 4; // 单值嵌套消息一对一 repeated int32 scores 5; // 重复基本类型数组 repeated Order orders 6; // 重复嵌套消息数组 }用 protoc 编译后会生成user.pb.h和user.pb.cc后续 C 代码需要包含这个头文件并链接 Protobuf 库。一、set 系列单值基本类型适用场景set_xxx()是 Protobuf 最基础的赋值方法专门用于单值基本类型字段int/string/bool/double 等也就是 Proto 里没有repeated修饰、也不是嵌套消息的字段。核心特点方法名规则set_ 字段名小写开头Proto 里的驼峰字段会自动转成下划线比如 Proto 里的orderId会生成set_order_id()赋值后调用has_xxx()会返回true判断字段是否已赋值支持覆盖赋值多次调用会替换原有值。代码示例#includeuser.pb.h#includeiostreamusingnamespacestd;intmain(){// 初始化User对象User user;// 给单值基本类型赋值set_xxx()user.set_id(1001);// 给int64类型赋值user.set_name(张三);// 给string类型赋值user.set_is_vip(true);// 给bool类型赋值// 验证赋值结果cout用户IDuser.id()endl;// 输出1001cout用户名user.name()endl;// 输出张三cout是否VIPboolalphauser.is_vip()endl;// 输出truecout是否设置了nameuser.has_name()endl;// 输出truereturn0;}小提醒Protobuf 3.x 中所有字段默认都是 optional可选不需要显式声明如果是 2.x 版本required 字段必须赋值否则序列化会报错。二、mutable 系列嵌套消息适用场景当字段是单值嵌套消息比如示例中 User 的default_order字段一对一的嵌套不能直接用 set 赋值必须通过mutable_xxx()获取可修改的消息指针再给嵌套消息的字段赋值。核心特点mutable_xxx()返回嵌套消息的非 const 指针通过指针可以修改嵌套消息的字段如果嵌套消息未初始化之前没赋值调用mutable_xxx()会自动创建一个空的嵌套消息对象对比get_xxx()get_xxx()返回 const 指针只能读不能改而mutable_xxx()是可写的。代码示例#includeuser.pb.h#includeiostreamusingnamespacestd;intmain(){User user;// 给嵌套消息赋值先通过mutable获取指针再赋值Order*default_orderuser.mutable_default_order();// 获取嵌套消息指针default_order-set_order_id(2025001);// 给嵌套消息的字段赋值default_order-set_product_name(小米手机);default_order-set_price(2999.99);// 简化写法链式调用user.mutable_default_order()-set_order_id(2025002);// 覆盖原有值// 读取嵌套消息内容cout默认订单IDuser.default_order().order_id()endl;// 输出2025002cout默认订单商品user.default_order().product_name()endl;// 输出小米手机return0;}常见坑点错误写法直接给get_xxx()返回的 const 指针赋值// 编译报错get_default_order()返回const Order*不能修改user.get_default_order()-set_order_id(2025001);正确写法必须用mutable_xxx()获取可写指针。三、add 系列重复字段适用场景add_xxx()专门用于repeated 字段重复字段对应 C 里的动态数组不管是重复基本类型还是重复嵌套消息新增元素都要用它。分两种情况讲解重复基本类型如示例中的scoresadd_xxx()直接传入值即可每次调用新增一个元素到数组末尾。重复嵌套消息如示例中的ordersadd_xxx()返回嵌套消息的指针需要通过指针给新元素赋值。代码示例#includeuser.pb.h#includeiostreamusingnamespacestd;intmain(){User user;// 1. 给重复基本类型赋值add_xxx(值)user.add_scores(90);// 新增第一个成绩user.add_scores(85);// 新增第二个成绩user.add_scores(95);// 新增第三个成绩// 遍历重复基本类型cout成绩列表;for(inti0;iuser.scores_size();i){coutuser.scores(i) ;// 输出90 85 95}coutendl;// 2. 给重复嵌套消息赋值add_xxx()返回指针再赋值Order*order1user.add_orders();// 新增第一个订单返回指针order1-set_order_id(2025001);order1-set_product_name(华为平板);order1-set_price(1999.0);Order*order2user.add_orders();// 新增第二个订单order2-set_order_id(2025002);order2-set_product_name(苹果耳机);order2-set_price(899.0);// 遍历重复嵌套消息cout订单列表endl;for(inti0;iuser.orders_size();i){constOrderorderuser.orders(i);cout第i1个订单IDorder.order_id()商品order.product_name()价格order.price()endl;}// 额外修改重复字段指定位置的元素MutableXXX()user.mutable_scores(1)-set_value(88);// 把第二个成绩改成88user.mutable_orders(0)-set_price(1899.0);// 把第一个订单价格改成1899.0return0;}补充重复字段的其他操作除了 add重复字段还有这些常用方法xxx_size()获取重复字段的元素个数clear_xxx()清空所有元素mutable_xxx(int index)获取指定索引位置的可修改指针修改已有元素xxx(int index)获取指定索引位置的 const 值只读。四、其他常用赋值方式除了 set/add/mutable还有几个高频赋值方法值得一提1. CopyFrom深拷贝整个消息把一个消息对象的所有字段值深拷贝到另一个对象会覆盖目标对象的原有值。#includeuser.pb.h#includeiostreamusingnamespacestd;intmain(){User user1;user1.set_id(1001);user1.set_name(张三);User user2;user2.CopyFrom(user1);// 把user1的所有值拷贝到user2coutuser2.id()endl;// 输出1001coutuser2.name()endl;// 输出张三return0;}2. MergeFrom合并消息不覆盖已有值和 CopyFrom 不同MergeFrom 只会把源对象中 “未设置” 的字段赋值给目标对象已有值的字段不会被覆盖。#includeuser.pb.h#includeiostreamusingnamespacestd;intmain(){User user1;user1.set_id(1001);user1.set_name(张三);User user2;user2.set_id(1002);// 先给id赋值user2.MergeFrom(user1);// 合并user1到user2coutuser2.id()endl;// 输出1002已有值不覆盖coutuser2.name()endl;// 输出张三无值合并return0;}3. Swap交换两个消息的内容高效交换两个同类型消息的所有字段底层只是交换指针性能极高。#includeuser.pb.h#includeiostreamusingnamespacestd;intmain(){User user1,user2;user1.set_id(1001);user2.set_id(1002);user1.Swap(user2);// 交换内容coutuser1.id()endl;// 输出1002coutuser2.id()endl;// 输出1001return0;}五、核心用法总结表为了方便大家快速查阅我把所有赋值方式的适用场景整理成了表格方法类型方法名示例适用字段类型核心作用setset_id()单值基本类型int/string 等给单值基本类型字段赋值mutablemutable_default_order()单值嵌套消息获取嵌套消息指针修改其字段addadd_scores()重复基本类型新增重复基本类型元素addadd_orders()重复嵌套消息新增重复嵌套消息元素MutableXxxmutable_scores(0)重复字段指定位置修改重复字段指定索引的元素CopyFromCopyFrom(user1)任意消息类型深拷贝整个消息覆盖原有值MergeFromMergeFrom(user1)任意消息类型合并消息不覆盖已有值SwapSwap(user2)任意消息类型高效交换两个消息内容六、避坑指南嵌套消息别用 set比如想给default_order赋值别写user.set_default_order(xxx)Protobuf 不会生成这个方法必须用 mutable重复字段别直接改索引比如user.scores(0) 90是错的要改已有元素用mutable_scores(0)-set_value(90)别混淆 mutable 和 add单嵌套消息用 mutable重复字段新增用 add指定索引修改重复字段用mutable_xxx(index)注意空指针问题如果嵌套消息没初始化直接调用get_xxx()不会崩溃但返回的是空对象调用其方法会得到默认值比如 int 默认 0string 默认空版本兼容Protobuf 2.x 的 required 字段必须赋值3.x 移除了 required所有字段都是可选的。最后其实 Protobuf 的赋值逻辑很简单看字段类型选方法—— 基本类型用 set嵌套消息用 mutable重复字段用 add。平时写代码时多看看生成的.pb.h文件里的方法名就能快速对应上。如果大家还有其他踩坑经历或者有更简洁的用法欢迎在评论区交流 觉得这篇文章有用的话点个赞再走呗
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

交通局网站模板顺德网站制作案例如何

NoFences终极指南:开源免费的Windows桌面管理神器 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为杂乱的Windows桌面而烦恼吗?NoFences是一款开…

张小明 2025/12/26 11:25:32 网站建设

夏门建设局网站网站不用了怎么办

Linux实时特性与延迟跟踪器详解 高分辨率定时器与动态节拍 在操作系统中,像HZ这样的软件变量起着关键作用。当定时器到期,时钟源向CPU发送中断时,高精度定时器(hrtimer)会处理该事件。随后,系统会在红黑树中查询下一个事件,并将时钟源设置为在下一个所需事件发生时触发…

张小明 2025/12/26 12:06:47 网站建设

有哪些做图纸的网站wordpress付费查看视频

2025年初,人工智能领域再度迎来了震撼性发布。OpenAI 推出了全新版本的 GPT-5.2 系列,而 谷歌 紧随其后推出了全新 Gemini Deep Research API。这两款技术产品的问世,引发了行业内外的广泛关注。二者的对决,不仅代表了两家科技巨头…

张小明 2025/12/26 11:44:34 网站建设

哪里有做兼职的网站wordpress分类目录模板制作

如何在Git Bash中使用清华镜像快速克隆TensorFlow项目? 在搭建深度学习开发环境时,你是否曾经历过这样的场景:打开 Git Bash,输入 git clone https://github.com/tensorflow/tensorflow.git,然后眼睁睁看着下载速度卡…

张小明 2025/12/26 12:57:38 网站建设

企业网站的作用施工企业汛期应急预案

首先我们打开Navicat Premium 17后点击新建连接后进入该页面1.连接名称,用户名,密码,都在宝塔数据库内直接复制主机是你服务器的IP2.端口这个有些复杂,需要点击服务器的查看详情点击添加规则按照下图的内容选择来源和输入端口号33…

张小明 2025/12/26 12:41:30 网站建设