每一种开发语言都会有自己独特的风格规范(或指南)。遵循规范的开发人员可以带来显着的收益,有效促进团队合作,减少错误错误,降低维护成本等。Google的开源GoogleStyleGuides(https://google.github.io/styleguide/)为多种编程语言提供了风格指南,包括C++、Java、Python、JavaScript等。2022年11月,Go语言风格规范(https://google.github.io/styleguide/go/index)终于开源。如果你的团队还没有形成系统的Go风格规范,不妨参考这篇指南。本公众号会持续更新规范的中文翻译。本文接下来的内容将是该系列的第一篇,即【概览】。关于Go语言风格规范和附录文档整理了当前编写可读且真实的Go的最佳实践。遵循编程指南并不是绝对的,因为这些文档不可能详尽无遗。我们的目标是尽可能降低编写可读的Go代码的试错成本,让新手避免常见的错误。该规范还为那些在Google内部审查Go代码的人提供了统一的风格指南。文档链接主要受众规范的权威指南https://google.github.io/styleguide/go/guide每个人都是一个决定https://google.github.io/styleguide/go/decisions代码可用ReadabilityReviewerIsBestPracticehttps://google.github.io/styleguide/go/best-practices任何感兴趣的人没有文档1.[指南]概述了GoogleGo代码风格的基础知识。该文件具有权威性,被用作[决定]和[最佳实践]中建议的基础。2.[Decisions]是一个更详细的文件,总结了关于特定风格点的决定,并适当地讨论了这些决定背后的原因。这些决定可能会因为新的数据类型、新的语言特性、新的标准库或新的模型而改变,但我们不需要谷歌的Go程序员与这份文件实时保持一致。3.【最佳实践】记录了一些随时间演变的模式。这些模式解决了常见的问题,易于阅读,健壮性高,也满足了代码可维护性的要求。这些最佳实践并不具有权威性,但我们鼓励Google的Go程序员尽可能使用它们以保持代码库的一致性。这些文档的目的:就一组权衡替代编码风格的原则达成一致。Go编码风格的编纂解决了问题。记录并提供真实Go代码的规范示例。记录各种编码风格决策的利弊。有助于减少Go可读性代码审查中的意外。帮助代码可读性代码审阅者使用一致的术语和指南。不是这些文档的目的:成为代码审查下代码可读性审查人员的详尽清单。列出所有规则,并希望每个人都能记住并始终遵守这些规则。失去对语言特征和风格用法的正确判断。大规模修订以消除代码风格差异的借口。Go程序员之间以及团队的代码库之间总是存在差异。然而,保持我们的代码库尽可能一致符合Google和Alphabet的最大利益,因此请随意改进您认为合适的编码风格,并且当您发现不符合风格指南的行为时不要过度.鲤鱼。特别是,这些文档可能会随着时间的推移而改变,这不应该成为要求对现有代码库进行额外更改的理由;使用最新的最佳实践编写新代码就足够了,这些代码会随着时间的推移而更新。已经解决了。重要的是要认识到代码风格问题本质上是个人的,并且总是存在固有的权衡。这些文档中的大部分指导都是主观的,但与gofmt一样,它们提供的一致性具有很大的价值。因此,未经适当讨论,不得修改这些编码风格建议。Google鼓励Go程序员遵循这些编程风格指南,即使他们可能不同意其中的一些指南。定义了贯穿CodeStyle系列文档的一些术语,定义如下Canonical(权威):建立规范和持久的规则。在这些文档中,“权威”用于描述一种标准,该标准被认为是所有代码(旧的和新的)都遵循的,并且该声明不会随时间发生重大变化。权威文档中的原则应该被代码作者和审查者理解,并且权威文档中包含的所有内容都必须符合高标准。因此,权威文档通常比非权威文档更短,并且规定的代码样式元素更少。https://img.ydisp.cn/news/20221128/vk1a30k0nmeGo代码审阅者都同意的代码风格元素,以确保他们在提供建议、术语和理由方面保持一致。这些样式元素可能会随时间发生变化,这些文档将反映这些变化,以便代码审阅者可以使它们保持一致和最新。Go代码开发者不需要熟悉这些规范性文档,但是这些文档应该被代码审查者作为可读性审查的参考。https://img.ydisp.cn/news/20221128/h12jcmpwcak在Go代码中无处不在,已经成为一个容易识别的熟悉模式。一般来说,如果两个模式在上下文中服务于相同的目的,那么真实模式应该优先于非真实模式,因为这是代码读者最熟悉的模式。https://img.ydisp.cn/news/20221128/ii1hcmdaqlodata-id="hce1b53f-JcC6HLMZ"id="hce1b53f-JcC6HLMZ">其他参考资料本指南假定读者熟悉EffectiveGo(https://go.dev/doc/effective_go),因为它为整个Go社区的Go代码提供了一个通用基线。下面是一些额外的资源,供那些希望自学Go编码风格的人使用,以及指向对代码审阅者更有用的评论的链接。我们不希望Go代码可读性的参与者熟悉这些资源,但它们可能会作为代码可读性审查的背景出现。外部参考[Go语言规范]https://go.dev/ref/spec[Go常见问题解答]https://go.dev/doc/faq[Go内存模型]https://go.dev/ref/mem[围棋数据结构]https://research.swtch.com/godata[围棋界面]https://research.swtch.com/interfaces[围棋谚语]https://go-proverbs.github.io/Go技巧-敬请期待。相关“厕所测试”文档[TotT:标识符命名]https://testing.googleblog.com/2017/10/code-health-identifiernamingpostforworl.html[TotT:测试状态与测试交互]https://testing.googleblog.com/2013/03/testing-on-toilet-testing-state-vs.html[TotT:有效测试]https://testing.googleblog.com/2014/05/testing-on-toilet-effective-testing。html[TotT:风险驱动测试]https://testing.googleblog.com/2014/05/testing-on-toilet-risk-driven-testing.html[TotT:变更检测器测试被认为是有害的]https://testing.googleblog.com/2015/01/testing-on-toilet-change-detector-tests.html其他外部作品[GoDogma]https://research.swtch.com/dogma[少即是多]https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html[埃斯梅拉达的想象力]https://commandcenter.blogspot.com/2011/12/esmereldas-imagination.html[用于解析的正则表达式]https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html[Gofmt的风格没人喜欢,但Gofmt却是大家的最爱]https://www.youtube.com/watch?v=PAAkCSZUG1c&t=8m43s(YouTube)
