再见,Python!你好,Go语言

Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。因为出身名门,Go 在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经涌出了不少基于 Go 的应用。就在很少久以前,知乎也舍弃了 Python,转 用Go 重构推荐系统 。前端

做者:华为云技术宅基地 连接:https://zhuanlan.zhihu.com/p/57895717mysql

谷歌前员工 Jake Wilson 认为,比起你们熟悉的 Python,Go 语言其实有不少优良特性,不少时候均可以代替 Python,他已经在不少任务中使用 Go 语言替代了 Python。那么 Go 语言到底有着什么样的独特魅力?它有哪些胜于 Python 的地方呢?让咱们一块儿来了解一下吧!android

2019 年程序员最想学习的编程语言

image

出身名门的 Go 语言nginx

对于一门只有十年历史的新语言,Go 的发展势头至关迅猛,容器界的扛把子 Docker 就是用 Go 写的,国内也有很多团队普遍使用 Go。近日,HackerRank 在社区发起了程序员技能调查,来自 100 多个国家、超过 70000 名开发者参与其中。调查结果显示,2019 年,程序员最想学习的编程语言 Top 3 分别是 Go、Kotlin 和 Python,其中 Go 以 37.2% 的比例排在首位。git

image

但 Go 要想撼动编程界的常青树 Java 二十多年的地位无疑难度颇大。据 HackerRank 数据显示,2018 年,Java 在开发者最受欢迎的编程语言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,距离第一名 JavaScript 还有不小的差距。程序员

但对本文做者 Jack Wilson 来讲,Go 语言虽然“年纪尚小”,但已经拥有不少很是优秀的特性。github

Go 语言到底好在哪?

在不少任务上,我已经用 Go 语言代替了 Python,举几个例子:sql

  • 处理储存在 S3 上的云端日志
  • 在 S3 上的 bucket 和 / 或 region 之间移动 TB 级别大小的文件
  • 匹配本地的数据库记录和 S3 上的文件,以保证文件处于同步状态

这些任务大可能是一次性的,因此使用脚本语言操做就会比较合适。这些任务须要快速地编程,而代码用过一次通常就舍弃了。通常来讲,这种任务的需求都比较新颖、比较专,其代码不多须要复用。下面就来介绍一下,针对这种任务为何能够用 Go 语言来替代 Python。mongodb

拥有编译器很方便

我常常在写 Python 时犯很低级的错误。我会给变量或函数命错名,或向它们传递错误的参数。这样的错误用调试工具能够找出一部分,但这种工具通常须要专门设置。我历来没很方便地配置过 pylint,并且我也不喜欢用那些很重的、配置起来更麻烦的 IDE。最惨的状况是,你可能会不当心打错变量名,而这种错误又不太容易发现。你的脚本可能会跑好几个小时才赶上这个错误,而后一切都崩溃了,你又得从头开始跑这个脚本。这种错误大部分均可以靠单元测试检出,但单元测试不多能覆盖 100% 的代码,并且我并不想浪费时间去给一个只用一次的脚本写单元测试。而带编译器的语言就能够解决以上全部问题。**编译器能够检测出你犯的全部低级错误。**出于这点缘由,我在写长达几百行的代码时,更倾向于使用 Go 这类语言。数据库

开发速度

然而,须要编译的语言的一个缺点是,通常你的开发速度会降低。这点在 C/C++ 和 Java 等语言上体现得尤为明显。而 Go 是一个很是简单的语言,我发现它的开发速度并无被拖慢多少。不要误会,个人意思并非说它比 Python 还快,而是想说,**用 Go 语言没有比 Python 慢不少,通常达到使用 Python 开发速度的 85% 仍是没问题的。**相对于拥有编译器能避免的那些低级错误来讲,我认为牺牲 15% 的开发速度仍是很值的。

更好的并行性

你可能已经知道,Go 语言就是为并行而生的。在个人团队里常常会须要并行程序,由于咱们要在 S3 上操做咱们数据库中大量的数据。若是该任务是 IO 密集型的(实际上不少任务都是),咱们就能够很容易地部署 Python 线程。但若是任务是 CPU 密集型的,用 Python 就比较不方便了,由于有全局解释器锁的存在。我很是享受在 Go 语言中简单代码不用修改就能直接多线程运行的爽快感。不知你在 Python 中有没有遇到过这种问题:直接复制粘贴的多线程代码却彻底不工做。在 Go 语言中就不会有此问题。

部署简单

我比较喜欢把全部依赖放在单个二进制文件里。我常常在 EC2 服务器上运行本身的脚本,好让环境更加接近咱们在 S3 上的服务器。若是用 Python 的话,我须要保证全部须要的包都在服务器上装好,并且个人同事不能在服务器上装任何可能产生冲突的包。虚拟环境能够解决大部分问题,但我仍是以为用 Go 语言更方便。我通常是在 Mac 和 Linux 上交叉编译个人代码,将其拷贝到远程服务器上,而后就能够任其运行了。个人代码所须要的全部依赖都在一个二进制文件里。

风格一致

一开始,Go 语言的格式化工具 gofmt 实在是让我抓狂,尤为是它在代码缩进时要求使用 tab 键而不是空格键。我以为这简直是疯了。可是我用了一段时间后,就开始“真香”了。写代码时,我在格式上能够天马行空,格式化工具会帮我完成一切。个人全部代码风格都是一致的,即便我是在写不一样的项目。这是由于格式化是标准 Go 工具的一个特性。但我若是想在 Python 中实现这一点,就要费些劲儿了。我须要正确地配置 pylint 工具,并要保证在每个项目中都使用它。

更便捷的工具

Gofmt 只是 Go 语言众多工具中的一个小例子。全部我喜欢用的编辑器——VSCode,vim 和 Sublime Text 中,都有 Go 语言相应的扩展,让我可以方便地享受到 Go 工具的优势。这样,我就能得到写 Java 时的那种智能体验,却不须要真正使用一个 IDE。我在用 Python 时从未得到过这种体验。

Go 语言固然也有缺点

我每次看到批评 Go 语言的文章时,里面讲的几乎都是 Go 语言对关键特性的缺失,好比泛型。我却是认为没有泛型没什么影响——你会发现,使用map和切片(Slice)就能实现多得惊人的操做。可是我在使用 Go 语言的过程当中遇到了不少其余问题。

缺少灵活性

首先,Go 语言多是我用过的语言里最“执拗”的语言了。好比,它除了会强迫你使用 tab 而不是空格键缩进(假设你用了 gofmt 工具),会强迫你使用特定的文件组织结构,还会强迫你在 GOPATH 环境变量中编程,如此等等。这种语言有太多难以改变的特性了。Go 语言简单易学的缘由之一恐怕就是你不能改变这些特性。若是你不肯意将全部首字母大写的变量名 export 一遍,那真是抱歉了。幸运的是,Go 的这些特性却是没有触犯个人原则底线,可是若是有人认为里面的某些要求根本没法理喻,我也可以理解。相比之下 Python 就灵活多了。

库支持有点差劲

在这方面把 Go 语言和 Python 作比较有些不公平。Go 的出现比 Python 晚不少,但当我发现有些功能 Go 竟然不支持的时候,仍是以为很困惑。我甚至发现 StackOverflow 上不少人 po 出了本应该做为内置功能的代码段,并且你们都须要该功能,纷纷将代码复制粘贴到本身的项目下。这类功能不该该嵌入到语言内部吗?说到这里,我想到了近几年的两个例子:

  • 给切片排序(幸运的是在 Go 1.8 版本中这点方便多了)
  • Math.round 只支持整数,不能进行浮点数的取整(好比你想找一个最接近 0.5 的整数,Go 语言就没法完成)。甚至在 Go 1.10 版本以前,根本没有 math.round 函数

固然,这些问题的缘由有一部分是 Go 语言没有泛型,另外一部分是由于 Go 的开发者们只给 Go 的标准库中添加最最必要的功能。

这两点我都理解,可是在遇到很小的问题却须要本身写代码解决时仍是感到烦恼。但愿随着 Go 语言的发展,它的问题会变得愈来愈少。

Go 和 Python 你更喜欢谁?欢迎留言交流!

在接触Golang之前,我用C/C++、Lua及Python做为主要开发语言。

C/C++的问题:

  • 开发效率低,对开发者要求高
  • libc只向后兼容,运维难度偏大

Lua/Python的问题:

  • 动态语言,缺乏编译过程,低级错误频出
  • 缺乏有效的性能分析及调试工具

** 场景**

当时刚完成了nginx WAF模块的开发工做,便开始着手搭建WAF的后台管理系统。 因为以前同事都用的fluentd做为日志收集组件,为保持基础组件的一致性,我也选择了fluentd。 即最终架构为fluentd->mongodb->mysql,再基于mysql作前端数据展现。 后来被坑了许屡次,就决定用Go重写fluentd以解决下面几个问题:

  • fluentd在ubuntu 9.04偶尔会出现假死,致使数据丢失
  • fluentd难以接入公司现有的包发布系统,致使运维难度极大
  • mongodb采用mmap实现,数据量大时占用内存太高

方案

事实上,这两个项目都是为了解决上面提到的问题。 提及来也许你不信,这两个套代码是我在业余时间完成的,也就是说这根本不算在KPI以内。 其实一开始我也没想到可以这么快就写得七七八八,毕竟是现学现用啊。 但实际状况就是,我花了一周时间写完httpmq,一个月多时间就写好了gofluent……固然,这两个项目还有不少不完善的地方。目前就日志收集方案来讲,我更推荐elastic/logstash-forwarder · GitHubelastic/logstash · GitHub配合使用。

为何选择Golang

那么,为何我会选择Golang呢?其实我在作出这个选择以前已经花了大量时间作过详尽调研。 国外如Google、AWS、Cloudflare、CoreOS等,国内如七牛、阿里等都已经开始大规模使用Golang开发其云计算相关产品。 跟着世界级巨人的脚步应该不至于走错方向,并且在学习Golang的过程当中,我也渐渐被其背后的设计哲学所折服。

另外,云风博客中曾说过这样一句话:

我发现我花了四年时间锤炼本身用 C 语言构建系统的能力,试图找到一个规范,能够更好的编写软件。结果发现只是对 Go 的模仿。缺少语言层面的支持,只能是一个拙劣的模仿。

如下则是我对Golang的浅薄理解:

  • 有C基础,学Golang很是轻松
  • 同步方式轻松实现高并发
  • 代码简洁,格式统一,阅读方便
  • 性能强劲的同时,开发效率又不差于Python等动态语言

效果

最开始准备上线的时候其实内心挺忐忑,毕竟一旦出现故障,不只黑锅得本身背,面子也上过不去啊。 还好结果蛮漂亮,自上线后没出现过一次突发性BUG,下降运维难度的同时还减小了机器的负载。

总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样能够很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的奇点。

阅读更多

资本寒冬下的android面经

编程时,照着别人的代码敲进去有效率吗?

开发了5年android,我开始了go学习之旅

2018 开发者生态报告:Java 最流行,Go 最有潜力,JavaScript最经常使用

最后, 我仍是建议你在这个互联网时代里,不要刻意追求一种语言,每一种语言都是有他的优点,选择合适的才是最重要的。互联网没有过时的技术,也没有寒冷的冬天。咱们选择尽量多的储备粮食柴火。欢迎关注我微信技术号:终端研发部,id:codeGoogler。若是您遇到什么问题,也能够和我一块交流~

相关文章
相关标签/搜索