oneof 和 wrapper 在 Protobuf 里都能表达“可选”,但序列化后的字节数差了一倍,代码里判空的方式也完全不同
wrapper 类型因多一层 length-delimited 嵌套,序列化体积比 oneof 大,尤其对 varint 类型差距可达一倍。代码判空上,wrapper 用指针判 nil 更直觉,oneof 需类型断言,心智负担重。oneof 适合多字段互斥场景,能自动清旧值;仅需区分 null 和零值时,推荐用原生 optional 关键字,兼顾小体积和简洁判空。
共 1 篇文章
wrapper 类型因多一层 length-delimited 嵌套,序列化体积比 oneof 大,尤其对 varint 类型差距可达一倍。代码判空上,wrapper 用指针判 nil 更直觉,oneof 需类型断言,心智负担重。oneof 适合多字段互斥场景,能自动清旧值;仅需区分 null 和零值时,推荐用原生 optional 关键字,兼顾小体积和简洁判空。