了解 Go 结构体中的字段可见性
在 Go 中使用结构体时,开发人员经常会遇到一个问题,即只能访问具有大写标识符的字段在当前包之外。在数据库中存储结构或将它们编组为 JSON 时,这可能会特别成问题。
在提供的代码片段中,Person 和 Sample 结构包含具有大写和小写标识符的字段。然而,当与 CouchDB 数据库交互或将 Sample 结构转换为 JSON 时,仅包含具有大写标识符的字段。
此行为植根于 Go 的可见性规则,该规则规定仅以小写字母开头的标识符在当前包中可见。由于 JSON 编码器和 CouchDB 客户端位于不同的包中,因此它们无法直接访问结构体中带有小写标识符的字段。
解决方案:使用 JSON 标签
来克服针对这个限制,Go 提供了一种称为“JSON 标签”的机制。 JSON 标签允许您指定在 JSON 编组和解组期间应如何对结构字段进行编码和解码。通过将 JSON 标签添加到具有小写标识符的字段,您可以使其对 JSON 编码器可见。
例如:
type Sample struct { Name string `json:"name"` Age int `json:"age"` }
在此更新的代码中,姓名和年龄字段都用 json 指令标记。这指示 JSON 编码器在编组期间包含这两个字段,即使age以小写字母开头。
扩展至 CouchDB
虽然用于 CouchDB 访问的指定库确实如此没有明确支持 JSON 标签,可以利用 Go 标准库的 JSON 编码功能来实现所需的结果。下面是使用标记字段的 PostDocument 函数的修改版本:
func (db *Database) PostDocument(v interface{}) (*Document, error) { b, err := json.Marshal(v) if err != nil { return nil, err } resp, err := db.httpClient.Post(db.URL+db.name+"/", "application/json", bytes.NewReader(b)) if err != nil { return nil, err } defer resp.Body.Close() return decodeDocument(resp.Body) }
通过使用 json.Marshal 函数将结构体转换为 JSON,然后将其发布到数据库,标记字段将被正确编码。
结论
理解 Go 的字段可见性规则并利用在跨包边界处理结构时,JSON 标签至关重要。通过应用这些原则,您可以确保在数据交换期间所有字段都可访问并正确序列化。
以上是为什么 Go 结构中的大写字段只能在包外部访问,以及如何在 JSON 编组和数据库交互中包含小写字段?的详细内容。更多信息请关注PHP中文网其他相关文章!