vault backup: 2026-05-12 15:26:17
This commit is contained in:
@@ -120,7 +120,7 @@ var req LoginRequest
|
||||
fmt.Println(req.Username) // "" — 到底是没传还是传了 ""?
|
||||
```
|
||||
|
||||
**这就是 proto3 最著名的陷阱:客户端读不到"未设置"和"设为零值"的区别。** 解决之道是在需要使用包装类型时用 Wrapper Types,详情见 [02-数据类型详解](./02-数据类型详解.md)。
|
||||
**这就是 proto3 最著名的陷阱:客户端读不到"未设置"和"设为零值"的区别。** proto2 通过 `has_xxx` 字段解决这个问题,而 proto3 在 3.12+ 引入了 `optional` 关键字(生成时同样附带 `has_xxx`)。不过最通用的实践仍是用包装类型——详见 [02-数据类型详解](./02-数据类型详解.md)。
|
||||
|
||||
## Enum 枚举类型
|
||||
|
||||
@@ -189,7 +189,7 @@ case *UpdateProfileRequest_Email:
|
||||
```
|
||||
|
||||
> [!question] oneof vs 单独字段?什么时候该用 oneof?
|
||||
> 如果你希望业务逻辑保证「每次请求只更新一个字段」,用 oneof 可以让编译器帮你 enforcing 这个约束。但如果只是"几个可选字段可能同时出现"的场景,反而应该用单独的 field —— oneof 会增加代码复杂度(需要 switch/case 判断哪个被设置了)。**本质区别:oneof 表达的是"二选一或多选一"的互斥关系。**
|
||||
> 如果你希望业务逻辑保证「每次请求只更新一个字段」,用 oneof 可以让编译器强制约束这个规则。但如果只是"几个可选字段可能同时出现"的场景,反而应该用单独的 field —— oneof 会增加代码复杂度(需要 switch/case 判断哪个被设置了)。**本质区别:oneof 表达的是"二选一或多选一"的互斥关系。**
|
||||
|
||||
## Map 键值映射
|
||||
|
||||
@@ -207,7 +207,7 @@ message UserProfile {
|
||||
}
|
||||
```
|
||||
|
||||
在 Go 中生成的对应类型为 `map[string]string`,**注意默认为 nil(而非空 map)**。如果需要确保非 nil,可以用 `repeated` + key-value message 替代。
|
||||
在 Go 中生成的对应类型为 `map[string]string`,**注意默认为 nil**。如果需要确保非 nil,可以用 `repeated` + key-value message 替代。
|
||||
|
||||
## Reserved 保留字段
|
||||
|
||||
|
||||
Reference in New Issue
Block a user