了解 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中文网其他相关文章!

whentestinggocodewithinitfunctions,useexplicitseTupfunctionsorseParateTestFileSteSteTepteTementDippedDependendendencyOnInItfunctionsIdeFunctionSideFunctionsEffect.1)useexplicitsetupfunctionStocontrolglobalvaribalization.2)createSepEpontrolglobalvarialization

go'serrorhandlingurturnserrorsasvalues,与Javaandpythonwhichuseexceptions.1)go'smethodensursexplitirorhanderling,propertingrobustcodebutincreasingverbosity.2)

AnefactiveInterfaceoisminimal,clear and promotesloosecoupling.1)minimizeTheInterfaceForflexibility andeaseofimplementation.2)useInterInterfaceForeabStractionTosWapImplementations withCallingCallingCode.3)

集中式错误处理在Go语言中可以提升代码的可读性和可维护性。其实现方式和优势包括:1.将错误处理逻辑从业务逻辑中分离,简化代码。2.通过集中处理错误,确保错误处理的一致性。3.使用defer和recover来捕获和处理panic,增强程序健壮性。

Ingo,替代词Inivuntionsionializatializatializationfunctionsandsingletons.1)customInitializationfunctions hallowexpliticpliticpliticconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconcontirization curssementializatizatupsetups.2)单次固定元素限制ininconinconcurrent

Gohandlesinterfacesandtypeassertionseffectively,enhancingcodeflexibilityandrobustness.1)Typeassertionsallowruntimetypechecking,asseenwiththeShapeinterfaceandCircletype.2)Typeswitcheshandlemultipletypesefficiently,usefulforvariousshapesimplementingthe

Go语言的错误处理通过errors.Is和errors.As函数变得更加灵活和可读。1.errors.Is用于检查错误是否与指定错误相同,适用于错误链的处理。2.errors.As不仅能检查错误类型,还能将错误转换为具体类型,方便提取错误信息。使用这些函数可以简化错误处理逻辑,但需注意错误链的正确传递和避免过度依赖以防代码复杂化。

tomakegoapplicationsRunfasterandMorefly,useProflingTools,leverageConCurrency,andManageMoryfectily.1)usepprofforcpuorforcpuandmemoryproflingtoidentifybottlenecks.2)upitizegorizegoroutizegoroutinesandchannelstoparalletaparelalyizetasksandimproverperformance.3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载
最流行的的开源编辑器