标签 docker 下的文章

官宣:Go专栏“改善Go语言编程质量的50个有效实践”上线了

断断续续写了一年多的Go专栏:《改善Go语言编程质量的50个有效实践》今天终于正式上线了!- https://www.imooc.com/read/87

img{512x368}

慕课专栏:《改善Go语言编程质量的50个有效实践》

Go语言是Google大牛团队(Robert Griesemer、Rob Pike以及Ken Thompson)设计的一种静态类型、编译型编程语言,支持垃圾回收和轻量级并发,它于2009年11月诞生,一面世就以语法简单、原生支持并发、标准库强大、工具链丰富等优点吸引了大量开发者。经过10余年演化和发展,Go如今已成为云基础架构的标准编程语言,很多云原生时代的杀手级平台、中间件、协议和应用都是采用Go语言开发的,比如:DockerKubernetes以太坊Hyperledger Fabric超级账本、新一代互联网基础设施协议ipfs等。

Go是一门特别容易入门的编程语言,无论是刚出校门的新手还是从其他编程语言转过来的成手,都可以在短时间内快速掌握Go语法并投入到Go代码的编写中。但笔者在日常收到很多Go初学者的疑问:Go入门容易,但进阶难,怎么才能像Go团队那样写出符合Go思维和语言惯例(idiomatic)的高质量代码呢?

这个问题也引发了我的思考。在2017年GopherChina大会上笔者以演讲的形式初次尝试回答这个问题,但鉴于演讲的时长有限,很多内容难于展开,效果不甚理想。而这个慕课网专栏则是我对解答这个问题作出的第二次尝试。

这次解答的思路有两个:

  • 思维层面:写出高质量Go代码的前提是思维方式的进阶,即使用Go语言的思维去写Go代码
  • 实践技巧层面:Go标准库、优秀Go开源库是一个挖倔高质量、符合Go惯用法的Go代码的宝库,对其进行阅读、挖掘和整理归纳,我们可以得到一些帮助我们快速进阶的有效实践

本专栏正是基于上面思路为想实现Go进阶但又不知从何入手的你而设的

首届图灵奖得主、著名计算机科学家艾伦·佩利(Alan J. Perlis)曾经说过:“不能影响到你的编程思维方式的编程语言不值得去学习和使用”,足见编程思维对编程语言学习和应用的重要性。只有真正领悟了一门编程语言的设计哲学和编程思维,并将其应用到日常编程当中去,你才算是真正地实现了在这门编程语言上的进阶。

因此,本专栏首先将带领大家回顾Go语言的演化历史,一起了解并深刻体会Go大牛们在设计Go语言时的所思所想,与大牛们实现思维上的共鸣,理清那些看似随意的,实则经过深思熟虑的设计的背后的付出。

接下来,本专栏将基于笔者对Go核心团队、Go社区高质量代码的分析归纳,从代码风格、基础语法、函数/方法、接口、并发、错误处理、测试调试、标准库、工程实践等多个方面给出改善Go代码质量,写出符合Go思维和惯例的代码的有效实践。

学习了本专栏的这50条有效实践,你将拥有和Go大牛们一样Go编程思维,写出符合Go惯例风格的高质量Go代码,从众多Go入门选手中脱颖而出,快速实现从Go编程新手到专家的转变!

本专栏共分10个模块(篇),50个小节。

  • 模块1:设计哲学篇

本专栏的开篇和总起。和读者一起穿越时空,回顾历史,详细了解Go语言的诞生、演化以及今天的发展。归纳总结Go语言的设计哲学和原生编程思维,让读者可以站在语言设计者的高度理解Go语言与众不同的设计,在更高层次,形成共鸣,产生认同。只有强烈认同,才能更上一层楼。

  • 模块2:代码风格篇

每种编程语言都有自己惯用的代码风格,而遵循语言惯用风格是高质量Go代码的必要条件。本篇详细介绍了得到公认且广泛使用的Go工程的结构布局、代码风格标准、标识符命名惯例以及变量声明形式等。

  • 模块3:基础语法篇

本模块详述在基础语法层面高质量Go代码的惯用法和有效实践,涵盖无类型常量的作用、定义Go的“枚举常量”、“零值可用”类型的意义、切片原理以及其高效的原因、Go包导入路径的真正含义等。

  • 模块4:函数与方法篇

函数和方法是Go程序的基本组成单元。本模块聚焦于函数与方法的设计与实现,涵盖init函数的使用、跻身“一等公民”行列的函数有何不同、Go方法的本质等帮助读者深入理解它们的内容。

  • 模块5:接口篇

接口是Go语言中的“魔法师”。本模块将聚焦接口,涵盖接口的设计惯例、使用接口类型的注意事项以及接口类型对代码可测试性的影响等。

  • 模块6:并发编程篇

Go以其轻量级的并发模型而闻名。本模块将详细介绍Go基本执行单元 – goroutine的调度原理、Go并发模型以及常见并发模式、Go支持并发的原生类型-channel的惯用使用模式等内容。

  • 模块7:错误处理篇

Go语言十分重视错误处理,它有着相对保守的设计和显式处理错误的惯例。本模块将涵盖Go错误处理的哲学以及在这套哲学下一些常见错误处理问题的优秀实践方案。

  • 模块8:测试与调试篇

Go自带强大且为人所称道的工具链,本模块将详细介绍Go在单元测试、性能测试以及代码调试方面的最佳实践方案。

  • 模块9:标准库篇

Go拥有功能强大且质量上乘的标准库,多数情况我们仅使用标准库所提供的功能而不借助第三方库就可实现应用的大部分功能,这大幅降低学习成本以及代码依赖的管理成本。本模块将详细说明高频使用的标准库包,如net/http、strings、bytes、time等的正确使用方式,以及reflect包、cgo在使用时的注意事项。

  • 模块10:工程实践篇

本模块将涵盖我们使用Go语言做软件项目过程中很大可能会遇到的一些工程问题的解决方法,包括:使用module进行Go包依赖管理、Go应用容器镜像、Go相关工具使用以及Go语言的避“坑”指南。

从上述专栏结构,我们也能看出本专栏并不是Go入门的最佳选择。如果非要给本专栏划定一个目标人群,或者说哪些读者阅读本专栏后会更多受益,我觉得是那些已经迈入Go语言世界、但迫切希望进一步提升层次、写出高质量Go代码的Go开发者。

很多朋友可能会问?你这个专栏有何与众不同之处?在专栏上线前编辑老师也让我编写课程亮点,我觉得下面这几句话可以概括专栏的特点:

  • 进阶必备 – 50个有效实践助你掌握高效Go程序设计之道;
  • 高屋建瓴 – Go设计哲学与编程思想先行;
  • 深入浅出 – 原理深入,例子简明,讲解透彻;
  • 图文并茂 – 大量图表辅助学习,重点难点轻松掌控;
  • 覆盖全面 – 覆盖高级面试知识点,求职更自信。

本专栏第一次落笔大约在Go 1.12发布后,大约将在今年10月份,即在Go 1.15发布后的第二个月完成。这中间有一定的跨度,因此专栏内的有些内容在各个Go版本间可能会有差异。笔者在内容中已经尽量做了版本适用标识,但难免有疏漏。各位读者在遇到问题时,可以及时反馈给我。

此外,Go语言还在飞速发展,一些当前的惯用表达方式或有效实践可能在日后因语言引入新的特性(比如:Go泛型)而“过时”。我会在我的博客上持续关注Go语言的演化,并将最新的Go高效编程实践分享给大家。

最后再来一次自我介绍:Tony Bai,Go语言技术专家和鼓吹者,GopherChina大会讲师,Go语言技术博客tonybai.com的作者,GopherDaily(Go日报)项目(github.com/bigwhite/gopherdaily)维护者,OSCHINA源创会技术讲师《七周七语言》译者之一,慕课网《Kubernetes实战:高可用集群搭建、配置、运维与应用》作者,开源拥趸

作为一名在国内接触Go语言较早(2012年)的Gopher和Go布道师,Tony Bai拥有丰富的Go开发知识和经验。他在个人博客上撰写了大量关于Go语言的文章,并深受Go社区欢迎。目前他正在国内一大型软件公司带领团队使用Go语言构建移动运营商的5G消息平台,这个平台将处理来自全国各地几十万个5G chatbot程序每天发送的几十亿条5G消息请求。

欢迎大家订阅我的专栏! 如有意见和建议,可在我本博文后面的评论中反馈。感谢大家支持。

专栏涉及的源码仓库地址:https://github.com/bigwhite/publication/tree/master/column/imooc/go-50tips/sources


我的Go技术专栏:“改善Go语⾔编程质量的50个有效实践”上线了,欢迎大家订阅学习!

我的网课“Kubernetes实战:高可用集群搭建、配置、运维与应用”在慕课网上线了,感谢小伙伴们学习支持!

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/
smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。

2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

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

我的联系方式:

微博:https://weibo.com/bigwhite20xx
微信公众号:iamtonybai
博客:tonybai.com
github: https://github.com/bigwhite

微信赞赏:
img{512x368}

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

Go语言联合作者Rob Pike专访:Go确实已成为云基础架构的语言

尽管看到Docker,Kubernetes和用Go编写的云计算的许多其他组件令人欣喜和重要,但也许并不奇怪。Go确实已经成为云基础架构的语言。- Rob Pike,Go编程语言的联合作者

本文翻译自《Rob Pike interview: “Go has indeed become the language of cloud infrastructure”》

img{512x368}

简介

我们与Go编程语言之父Rob Pike(以下称Rob)谈谈跨越整整40年的职业生涯、过去10年来Go语言的变化,以及未来Go语言的演化方向。

专访

Evrone:您与今天的许多开发人员不同,您数十年前就在Bell Labs开始了您的职业生涯。以您的阅历和认知,您认为我们开发软件时最大变化是什么?

Rob:今天的软件规模(scale)更大。不仅是计算机和网络,还有程序本身。所有Unix版本6(大约1975年)的程序都可以顺利地安装在单个RK05磁盘包上,该磁盘包的存储量刚刚超过2MB,还为用户软件留出了很大的空间。那是一个很好的计算环境,或者至少在当时看起来是一个。当然,尽管我可以解释其中的大部分增长,但令人惊讶的是,也许并不是所有的增长都是合理的。

Evrone:鉴于“变革的阻力”和“兼容性的承诺”,您如何看待Go编程语言及其生态系统在未来十年的发展?您认为的该技术的最佳未来是什么呢?

Rob:尽管还不确定,但经过十多年的努力,一个看起来更像是针对参数多态性的设计即我们俗称泛型(具有误导性)的东西将在未来一两年内问世。找到一个可以在现有语言中运行并且感觉好像属于它的设计是一个非常困难的问题,但是伊恩·泰勒(Ian Taylor)在该问题中投入了巨大的精力,看来现在已经找到了答案。我也非常渴望看到该设计会如何影响库、生态系统和社区的。

Evrone:随着“渐进类型”引入“动态类型”语言以及“类型推断”引入“静态类型”,两者之间的界限现在变得越来越模糊。您对现代编程语言的类型系统有何看法?

Rob:我非常喜欢静态类型,因为它带来了稳定性和安全性。

我也非常喜欢动态打类型,因为它带来的乐趣和轻巧的感觉。

我不喜欢类型驱动的编程、类型层次结构、类以及继承。尽管已经通过这些方式构建了许多非常成功的项目,但我认为这种方法将重要的决策过早地推到了设计阶段,而经验并没有影响到它。换句话说,我更喜欢组合而不是继承。

但是,我对那些喜欢使用继承来构造程序的人说:不必在意我的观点,请继续使用对你们有用的东西。

Evrone:有时候人们以奇怪的方式使用技术。例如,要从高级PythonRuby代码生成高效的Go代码(是的,我们已经看到了!)多年来,您看到过最奇怪,最有创意或有趣的Go用法了吗?最让您惊讶的是什么?

Rob:最大的惊喜是当我们得知Go被用于编写恶意软件时(译注:手动允悲)。您无法控制谁将使用您的作品或他们将如何使用它。

Evrone:您设计和实现了许多文本编辑器。您如何看待Visual Studio Code?通过LSP之类的技术,“文本编辑器”和IDE之间的界限现在变得模糊了。您是否认为软件开发人员需要功能强大的IDE(如GoLand)或使用VSCode很好?

Rob:我来自IDE之前的时代。但是在项目的早期,有人谈到Go是否需要IDE才能成功。但是,团队中没有人拥有这方面的技能,因此我们没有尝试去创建一个(Go专属IDE)。但是,我们确实创建了用于解析和打印Go代码的核心库,这为各种编辑器和IDE快速创建了高质量的插件提供了极大的便利,这也算是一个偶然的成功。

最近,我们一直在努力为Go开发LSP服务器,该服务器称为gopls,支持该协议的任何编辑器或IDE均可使用该服务器,以改善使用该语言的体验。

也许是因为我们对使用简单的编辑器形式感到满意,所以我们确保大家无需背负沉重的编程环境搭建负担即可轻松地使用Go工作。但是,IDE当然可以提供帮助:我今天看到的大多数使用Go IDE或至少使用具有自定义Go支持的编辑器的开发人员都能从中获得很多价值。

使用哪种编辑器风格的问题取决于您的口味,并随您所用语言的文化而变化。

Evrone:软件开发人员倾向于给事物打标签,例如Dart是一种“前端语言”,而C是一种“系统底层语言”,等等。就目前的Go语言的功能集和用法,您现在如何称呼它?

Rob: Go是一种通用编程语言。编写您想要的任何内容,不必担心将语言或与此相关的任何其他技术固定到单个问题域。

Evrone:您个人还喜欢哪些其他现代编程语言?

Rob:Go的经验告诉我,人们喜欢对语言发表意见,这可能比我们领域中的几乎任何其他要素都要多。我当然也是这样做的。但是我对经常导致的消极情绪感到厌倦,所以现在我尽量避免评判那些事情。

在很少有新的语言问世并获得成功的一段时间之后,在过去的十多年中,语言设计才有了真正的复兴。很高兴看到这一点及其带来的创新。

Evrone:成为Google员工是如何帮助您开发和引导Go语言的?能够在Twitter上问“告诉我们您如何使用我们的语言”并获得全球最大公司的回应有多重要?它只是语言开发的一个不错的补充还是必不可少的一部分?Google如何为您提供帮助的?

Rob: Google非常支持Go项目,对此我深表感谢。当然,创建该语言是因为我们认为Google需要它。所谓的“云计算”需要一种具有对并发性和易于部署等方面良好支持的语言。但是Google并没有以任何重要方式指导该项目。它支持我们,让我们做我们认为最好的事情。

对于其他公司和其他用户,社区的投入对于理解项目的进展至关重要,我的意思是语言,编译器,工具,运行时,库,环境(所有这些)的发展。

Evrone:经过10年的Go开发以及对其使用方式的观察,您能说出该语言最大的设计成功和最大的失败是什么?分别是最强点和最弱点?

Rob:我要说两件事,一是技术问题,一是政治问题。

技术上是对并发计算的原生(first-class)支持。Go仅仅存在了十年左右,但是当它被开发时,“线程”和并发在编程社区中并未得到广泛认可。实际上,创建Go的主要原因是当时很难用C++进行并发计算。并发支持在发布后不久就很明显成为了该语言的一个主要吸引力,可以弥补一些人认为该语言其他部分的缺点。并发动了大家的神经。一旦人们开始使用并发功能,他们便开始探索有关该语言的其他内容,并发现那里(Go语言中)存在的东西超出了他们最初的想象。支持并发是(进入Go语言世界)的网关。

正如CloudflareJohn Graham-Cumming所说:“我为实现简单的并发而来,而为实现简单的组合而留下来”

Go改变了有关如何对多核计算机进行编程的讨论。

Go语言在政治上的成功是坚定的执行了关于Go1兼容性的承诺。曾经我们和社区一旦使用Go几年,我们就有了很长的清单需要修复,但是变化是破坏性的。因此,我们仔细设计了更新程序,并使用了“go fix”命令来推动社区发展。完成这些后,我们不仅停了下来,而且还承诺会保持这种“停止”状态。这种稳定性 – 2012年编写的Go程序今天仍可以编译并完美运行 – 是促进增长的巨大推动力。公司可以放心使用我们,因为我们不会破坏其软件。在Go 1.0版本及其兼容性承诺出现之后,Go的采用率急剧上升。而且,从那以后,尽管我们有许多我们想改变的东西,但是我们不能破坏现有的程序,对此,我们感觉很好。

Evrone:您的工作与生活平衡如何?现在有很多关于“倦怠”的话题,这种流行病根本没有帮助。以你40年的阅历,您对新一代开发者有何提醒?

Rob:避免倦怠的最佳方法是在支持您的环境中做自己真正喜欢的事情。在整个职业生涯中,我一直很幸运,但是我意识到并不是每个人都如此幸运。如果您因工作而感到压力,则应随时休息或改变方向,尤其是在当前情况下。

Evrone:事后看来,许多技术的普及归功于使它们流行的所谓“杀手级应用”。您能为Go编程语言列举出这样的“杀手级应用程序”吗?您整体上对这种“杀手级应用程序”想法有何看法?

Rob:几年前,Danny Berkholz将Go称为“云基础架构的新兴语言”,这绝非偶然。Go是由Google的工作人员设计的,目的是使编写与Google相关的软件(特别是驻留在网络中的服务器)更容易。就是今天我们所说的“云”。(该设计的某些动机是在我2012年的Splash主题演讲: Go at Google: 软件工程服务中的语言设计

因此,尽管看到用Go语言编写的DockerKubernetes和云计算的许多其他组件很令人高兴且很重要,但也许并不奇怪。Go确实已经成为云基础架构的语言

Evrone:您觉得Go语言的竞争对手是谁?在哪个领域竞争?您对Rust的“无垃圾收集”构想和编译时保证有何看法?

Rob: Rust是一种有趣的语言,我很感兴趣地看着它的发展。除此之外,正如我上面所说,我没有意见。

Evrone:Go在GitHub上已达到7万颗星!您如何看待GitHub,Reddit,Twitter,离线和在线会议,网络研讨会等不同的社交活动对语言的影响?它们对语言的成功重要还是仅仅反映了语言的成功?

Rob:我们通过会议和社交媒体结识的人们一直是Go及其所有元素发展的关键部分。许多许多贡献者以积极的方式影响了开发,包括将Go移植到Windows和许多非x86架构上,工具和库的开发,对技术建议的深入讨论等等。

反过来,Go团队也与社区进行联系并积极讨论,提出问题并寻求帮助和指导。

我认为重要的一件事是,以一种声音与社区互动,以团队而非个人的身份说话。一致的消息更容易理解。

Evrone:成为一种流行的编程语言的作者如何改变了您的生活?

Rob:一个更正:我是合著者,而不是作者。肯·汤普森(Ken Thompson)和罗伯特·格里塞梅尔(Robert Griesemer)与我一起开始了这个项目,其他许多人也做出了巨大贡献。因此,请不要单把我列为“作者”。

为了回答您的问题,Go无疑提高了我的公众形象,并向我介绍了一个新的充满活力的社区,但是除此之外,它并没有太大的作用。我有很长的职业生涯,并取得了其他的成功(以及无数的失败)。

Evrone:想象一下,如果您有机会时光倒流并且给年轻时候的你提出一个建议(只有一个),如果是回到大约在您开始设计Go语言规范时,您会给您自己和您的同事提出什么建议?

Rob:很简单:忽略仇恨者(haters)。只倾听那些能理解和分享您目标的声音;他们是在乎Go的人。并非每个人都认同您在做的事情,这没关系。但是,那些致力于推进您想要做的事情的人可能会成为想法,能量和灵感的绝佳来源。

我们将永远感谢我们充满热情的社区。


我的网课“Kubernetes实战:高可用集群搭建、配置、运维与应用”在慕课网上线了,感谢小伙伴们学习支持!

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/
smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。

2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

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

我的联系方式:

微博:https://weibo.com/bigwhite20xx
微信公众号:iamtonybai
博客:tonybai.com
github: https://github.com/bigwhite

微信赞赏:
img{512x368}

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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats