Go语言中MongoDB序列化时,结构体字段首字母大写是否为必要条件?
- 内容介绍
- 文章标签
- 相关推荐
在Go语言里结构体字段是否能被外部包访问,取决于它的首字母是否大写。首字母大写的字段是导出的,能够被其他包、标准库甚至JSON/BSON编码器读取;首字母小写则是未导出的,任何外部代码都无法访问。
至于痛点一,MongoDB插入后出现空文档
很多开发者在使用官方 mongo-driver 或 mgo 时直接把字段写成小写。例如:
type User struct {
id primitive.ObjectID
name string
}
执行插入操作后MongoDB 里只看到一个空文档 {},因为驱动无法反射到这些未导出的字段。
至于痛点二,字段映射不一致导致数据丢失
即使字段首字母大写。如果没有显式的 bson 标签或标签与数据库字段名不匹配,也会导致部分字段被忽略或存储错误。至于例如,
type Product struct {
ID primitive.ObjectID `bson:"_id"`
Price float64 // 默认映射为 "Price" 而非 "price"
}
主要规则
- 导出规则: 字段首字母必须大写才能被 JSON/BSON 编码器访问。
- bson 标签: 用于精确指定 MongoDB 中的键名;缺省时会直接使用 Go 字段名。
- 默认命名策略: 既不会自动转为 snake_case,也不会自动转为 camelCase。
- 嵌套结构体一样受限: 每层都需要导出且标签正确,否则嵌套对象会变为空。
在Go语言里结构体字段是否能被外部包访问,取决于它的首字母是否大写。首字母大写的字段是导出的,能够被其他包、标准库甚至JSON/BSON编码器读取;首字母小写则是未导出的,任何外部代码都无法访问。
至于痛点一,MongoDB插入后出现空文档
很多开发者在使用官方 mongo-driver 或 mgo 时直接把字段写成小写。例如:
type User struct {
id primitive.ObjectID
name string
}
执行插入操作后MongoDB 里只看到一个空文档 {},因为驱动无法反射到这些未导出的字段。
至于痛点二,字段映射不一致导致数据丢失
即使字段首字母大写。如果没有显式的 bson 标签或标签与数据库字段名不匹配,也会导致部分字段被忽略或存储错误。至于例如,
type Product struct {
ID primitive.ObjectID `bson:"_id"`
Price float64 // 默认映射为 "Price" 而非 "price"
}
主要规则
- 导出规则: 字段首字母必须大写才能被 JSON/BSON 编码器访问。
- bson 标签: 用于精确指定 MongoDB 中的键名;缺省时会直接使用 Go 字段名。
- 默认命名策略: 既不会自动转为 snake_case,也不会自动转为 camelCase。
- 嵌套结构体一样受限: 每层都需要导出且标签正确,否则嵌套对象会变为空。

