这可能是最权威、最全面的Go语言编码风格规范了!

news/2024/5/20 7:08:42/文章来源:https://blog.csdn.net/bigwhite20xx/article/details/128059796

每种编程语言除了固定的语法之外,都会有属于自己的地道的(idiomatic)写法。其实,自然语言也不例外,你想,你用心想想是不是这样。

语言的设计者们希望开发人员都能编写统一风格的地道的代码,这样不仅代码可读性好,便于社区统一代码风格,而且针对惯用法的优化也可能会让地道的代码拥有更好的运行效率。语言团队也会不遗余力的通过各种方式(文档[2]、blog[3]、演讲[4]、书籍[5]、视频等)向开发者传授如何写出更地道、更高效、可读性更好的代码。

以Go语言为例,为了能让Gopher更好的了解如何写出高效、地道的Go代码,Go开源伊始就编写了《Effective Go》[6]和《Go FAQ》[7]两篇文档。前者负责介绍Go惯用法,后者则担负着将Go语言设计层面的问题以及解决思路与Gopher进行对齐的重任:

e80a5d2d44b87d50a2b146b24069ef39.png

同时,Go语言之父们以及Go团队核心成员们在早期十分活跃并不遗余力的向Go社区推广Go的惯用法,Go官方站点上积累的各个早期的blog文章[8]以及各个talk资料[9]也成为了gopher学习地道Go编码的重要参考:

128b8727657235f1d8fca72ea10409ab.png

这些资料为了全世界Gopher的Go编码风格建立了基线。大多数情况下只要遵循这些资料并借助gofmt工具的自动格式化就可以写出风格比较地道的Go代码了。

然而《Effective Go》更像是说明地道风格Go代码的总体原则,不能“面面俱到”的覆盖每个编码的细节,而大公司对内部代码的风格一致性有着严格的要求。这不仅是高质量的要求,也是内部高效协作的要求。于是在若干年后,一些较早接纳Go且成为Go重度用户的大厂和初创公司结合自己的工程实践纷纷推出了公司内使用的Go编码风格规范,这里就包含我们耳熟能详的Uber[10]、鹅厂[11]、sourcegraph[12]、CockroachDB[13]、gitlab[14] 等。这些Go代码风格指南也成为Go社区开发人员在代码风格规范性方面的重要参考

不过,这些公司推出的代码风格指南有一个共同特点,那就是规范性有余,但权威性和全面性不足。Go社区都期待这Go语言的发源地:Google公司的Go编码风格规范的推出。之前,Google已经在其style guide站点[15]上推出了其内部使用的很多主流编程语言的style guide,包括:C++[16]、Java[17]、C#[18]、JavaScript[19]、Python[20]、Shell[21]等。

25dbf9b3106840543ccc018b6b7078fc.png

在2022年11月份中旬,就在Go刚刚过完其第13个生日[22]而步入青少年成长阶段之际,Google内部的Go语言编码风格规范[23]终于出现在其style guide站点上了!

e89ec8dd026fe2b998744b494a70c50b.png

不过,在介绍Google Go style guide前,我们首先要知道有关google style guide的几点内容:

  • 这些guide的主要目的是Google内部自用,所有开发人员、代码审查人员、代码可读性导师必须要遵守并达成一致;

  • 所有语言的style guide都会随着语言的演进而持续更新优化;

  • 各个语言的style guide的结构布局与写作风格都不相同;

  • 这些style guide都不接受Google之外人员的pr。

如上图,Google内部的Go语言编码风格规范系列文档目前由四个部分组成,它们分别是概述、指南、决定和最佳实践。根据概述篇的内容我们可以大体知道每篇文档的功用。这一系列文档汇集了当前编写可读的且地道的(idiomatic)Go代码的最佳方法,其目的是使刚接触这门语言的开发者能够避免常见的错误,同时也为那些在Google内部审查Go代码的人提供统一的风格。

这些文档的重要性略有不同:

  • 指南篇[24](https://google.github.io/styleguide/go/guide)概述了Google的Go编码风格的基础。这份文件是权威性的,并被用作风格决定最佳实践两个文档中建议的基础。

  • 决定篇[25] (https://google.github.io/styleguide/go/decisions) 是一份内容更详细的文档,总结了关于特定风格点的决定,并在适当的地方讨论了决定背后的理由。这些决定可能偶尔会根据新的数据、新的语言特性、新的库或新出现的模式而改变。

  • 最佳实践篇[26](https://google.github.io/styleguide/go/best-practices)记录了一些随着时间的推移而发展起来的模式,这些模式可以解决常见的问题,且可读性好并足够健壮,可以满足对代码可维护性的要求。

初步阅读了一下,这系列文档份的确算是目前最权威、最全面的Go语言编码风格规范了!其中决定篇和最佳实践篇涵盖的内容非常全面,内容和例子也非常到位。只不过,这套规范由于刚刚推出,还有很多改善优化和标记todo的地方。并且,其中有些内容是与Google是强相关的,但这依然是一份值得每个gopher认真阅读的资料。

此外,整套文档中经常引用一个名为“Go tips”的文档,不过该文档尚未放出,但从行文中引用的go tips的章节标题来看,很值得期待!

本博客正在将这套文档翻译为中文供大家参考,目前概述篇[27]、指南篇[28]和决定篇[29]和最佳实践篇[30]均已经初步翻译完毕(机翻辅助)。待go tips文档发布后,这里也会将其译为中文。


“Gopher部落”知识星球[31]旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!2022年,Gopher部落全面改版,将持续分享Go语言与Go应用领域的知识、技巧与实践,并增加诸多互动形式。欢迎大家加入!

512966b63395f6cb3674f1dfc9cd996d.png

5ddc5de9e312d1885ddaf475dd617613.png

2a9b07167fdd789413a5649bc1c38824.png

cae7140c51420f76947873918b866023.jpeg

Gopher Daily(Gopher每日新闻)归档仓库 - https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx

  • 微博2:https://weibo.com/u/6484441286

  • 博客:tonybai.com

  • github: https://github.com/bigwhite

8b4b55c773d7b136847eb234e05874fc.png

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

参考资料

[1] 

本文永久链接: https://tonybai.com/2022/11/26/intro-of-google-go-style

[2] 

文档: https://go.dev/doc

[3] 

blog: https://go.dev/blog

[4] 

演讲: https://go.dev/talks

[5] 

书籍: http://www.gopl.io

[6] 

《Effective Go》: https://go.dev/doc/effective_go

[7] 

《Go FAQ》: https://go.dev/doc/faq

[8] 

blog文章: https://go.dev/blog/all

[9] 

各个talk资料: https://go.dev/talks/

[10] 

Uber: https://tonybai.com/2019/10/12/uber-go-style-guide/

[11] 

鹅厂: https://github.com/Tencent/secguide

[12] 

sourcegraph: https://about.sourcegraph.com/handbook/engineering/go_style_guide

[13] 

CockroachDB: https://github.com/cockroachdb/cockroach/blob/master/docs/style.md

[14] 

gitlab: https://docs.gitlab.com/ee/development/go_guide/

[15] 

style guide站点: https://google.github.io/styleguide/

[16] 

C++: https://google.github.io/styleguide/cppguide.html

[17] 

Java: https://google.github.io/styleguide/javaguide.html

[18] 

C#: https://google.github.io/styleguide/csharp-style.html

[19] 

JavaScript: https://google.github.io/styleguide/jsguide.html

[20] 

Python: https://google.github.io/styleguide/pyguide.html

[21] 

Shell: https://google.github.io/styleguide/shellguide.html

[22] 

第13个生日: https://tonybai.com/2022/11/11/go-opensource-13-years

[23] 

Google内部的Go语言编码风格规范: https://google.github.io/styleguide/go/

[24] 

指南篇: https://tonybai.com/google-go-style/google-go-style-guide

[25] 

决定篇: https://tonybai.com/google-go-style/google-go-style-decisions

[26] 

最佳实践篇: https://tonybai.com/google-go-style/google-go-style-best-practices

[27] 

概述篇: https://tonybai.com/google-go-style

[28] 

指南篇: https://tonybai.com/google-go-style/google-go-style-guide

[29] 

决定篇: https://tonybai.com/google-go-style/google-go-style-decisions

[30] 

最佳实践篇: https://tonybai.com/google-go-style/google-go-style-best-practices

[31] 

“Gopher部落”知识星球: https://wx.zsxq.com/dweb2/index/group/51284458844544

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_226283.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Packet Tracer 实验 - 排除多区域 OSPFv3 故障

地址分配表 设备 接口 IPv6 全局单播地址 IPv6 本地链路地址 默认网关 ISP GigabitEthernet0/0 2001:DB8:C1:1::1/64 FE80::C1 不适用 ASBR GigabitEthernet0/0 2001:DB8:C1:1::2/64 FE80::7 不适用 Serial0/0/0 2001:DB8:A8EA:F0A::1 FE80::7 不适用 S…

JSP学习日记

JSP简述 Java Sever Pages----->Java服务器界面 用于前后端结合 jsp为什么淘汰? 由于JSP的前后端耦合性极高,编写代码非常臃肿。前后端的代码放在一起,所以JSP可以看成是已经被淘汰的技术。 为什么还要学jsp? 由于一些公司…

基于遗传算法的自主式水下潜器路径规划问题附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

MFC编辑框控件属性和用法

目录 一、编辑框的属性 1.want return 2.Multiline 3.滚动条 4.添加完效果 二、初始化编辑框内容 三、复制与退出 四、edit control的值类型 五、思维拓展 一、编辑框的属性 默认情况下编辑框edit control 是可以横向无限输入的 1.want return 支持换行,…

自动化项目倍加福测距仪QSM WCS RS485 与西门子S7 200通信

1、程序流程图 2、WCS位置数据处理流程 第一步:设置S7-200的RS485的通讯波特率19.2kbps,通讯格式(8,1,E); 第二步:PLC向WCS发送请求码: A0A1为0,表示读码器地…

《人月神话》(The Mythical Man-Month)1 看清问题的本质:如果我们想解决问题,就必须试图先去理解它...

第一章 焦油坑(The Tar Pit)史前史中,没有比巨兽在焦油坑中垂死挣扎的场面更令人震撼的了。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越是猛烈,焦油纠缠得越紧,没有任何猛兽足够强壮或具有足够的技巧&a…

【C++数据结构】程序性能分析

程序性能分析 2.1 什么是程序性能 程序性能:所谓程序性能(performance of a program)是指运行这个程序所需要的内存和时间的多少。 性能分析:在性能分析(performance analysis)时,采用分析方…

基于粒子群算法的配电网重构研究matlab程序

基于粒子群算法的配电网重构研究matlab程序 参考文献:基于改进灰狼算法的含分布式电源配电网重构研究 (本文未考虑分布式电源) 摘要:使用基本环矩阵编码的智能优化算法在处理配电网重构问题中,通常使用无序的解空间&a…

玩链子游戏

一 游戏描述 有一条链子,上面有 n 颗钻石,钻石编号为 1~n 。可以对该链子执行两种操作: ① CUT a b c (区间切割操作) 切下从第 a 颗钻石到第 b 颗钻石的链子,把它插在剩余链子的第 c 颗钻石…

Pytorch中CrossEntropyLoss()详解

一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() ,结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类(具体几类)训练的时候是非常有用的。 二. 什么是交叉熵 交叉熵主要是用来判定实际的输出与期望…

水泥行业工业互联网平台(CCPS)解决方案

水泥行业经过过去十年的发展和调整,基本实现了集团化。集团管控当前面临的主要问题是数字的分散化和碎片化,建设工业互联网是新时期加强集团管控的必经之路。 CCPS平台优势 1.融合SOA理念的架构平台和系统框架。具有跨平台、易维护、可集成、可扩展、分…

【图像处理】基于图像聚类的无监督图像排序问题(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

遥感技术及高分遥感影像在地震中的应用及高分二号获取

长期以来,地震预报监测、灾害调查、灾情信息获取主要依靠实地勘测手段,其获取的数据精度和置信度虽然较高,但存在工作量大、效率低、费用高和信息不直观等缺点。遥感技术手段可在一定程度上克服传统实地勘测手段的缺点,并具有其他…

BUUCTF Misc ningen1 小明的保险箱1 爱因斯坦1 easycap1

ningen1 下载文件 使用kali中的binwalk查看 binwalk xxx.jpg 分离文件 打开 压缩包加密了,爆破 爆破成功,密码:8368 得到flag flag{b025fc9ca797a67d2103bfbc407a6d5f} 小明的保险箱1 下载文件 用010 editor打开 可以看到图…

Springboot——Controller层开发、请求与响应、RESTful开发规范

目录 一、入门案例(小了解,没啥用) 1.1 创建Springboot工程 1.2 导入maven坐标 1.3 controller层代码 1.4 postman测试 二、 REST常用注解 2.1 Controller 2.2 RequestMapping(请求映射路径) 2.3 Response…

UE5笔记【十】第一个蓝图项目:bluePrint。

我们将上升的斜坡或者楼梯隐藏,往下移动,使其隐藏在地面以下。然后将方块也向下移动,漏出一点来。我们要模拟的场景是:当人移动到蓝色方块上时,踩在方块上,上升的楼梯升起来。然后人可以上楼。 将蓝色方块…

有限元的学习笔记

杂七杂八 有限元刚度矩阵推导 例题 ppt matlab 特征值特征向量计算 西工大题 轴对称问题有限元法 高斯-赛德尔(Gauss-Seidel)迭代法求解线性方程组 A(a1,a2) B(b1,b2) AB (a1,a2)(b1,b2) a1b2-a2b1 A(a1,a2,a3) B(b1,b2,b3) AB (a1,a2,a3)(b1,b2,b3…

PyQt5学习笔记--多线程处理、数据交互

目录 1--引入多线程的原因 2--PyQt多线程的基本知识 3--多线程登录程序的实例 4--参考 1--引入多线程的原因 ① 如果Qt只采用单线程任务的方式,当遇到数据处理慢的情形时,会出现GUI卡死的情况。 ② 使用下述例子展示单线程任务的缺陷: …

JMETER也会遇到加密难题,中文乱码也能一并处理

文章目录加密的接口测试导出jar包,放入jmeter的lib/ext扩展目录JMeter输出中文乱码总结加密的接口测试 不管是接口测试还是性能测试,在遇到接口有加密入参的时候,该怎么办? 毫无疑问,放弃自己实现的想法,除…

现代密码学导论-16-选择明文攻击和CPA安全

目录 PCA不可区分实验 DEFINITION 3.21 PCA安全的加密方案 LR预言机实验 DEFINITION 3.22 多明文PCA安全的加密方案 THEOREM 3.23 定义3.21和定义3.22等价 PCA不可区分实验 通过运行G(1^n)获得密钥k敌手A被给定输入1^n并拥有访问预言机Enck()的权利,敌手A输出一…