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

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

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

出身名门的Go语言

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

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

但对本文作者Jack Wilson来说,Go语言虽然“年纪尚小”,但已经拥有很多非常优秀的特性。

Go语言到底好在哪?

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

  • 处理储存在S3上的云端日志

  • 在S3上的bucket和/或region之间移动TB级别大小的文件

  • 匹配本地的数据库记录和S3上的文件,以保证文件处于同步状态

这些任务大多是一次性的,所以使用脚本语言操作就会比较合适。这些任务需要快速地编程,而代码用过一次一般就舍弃了。一般来说,这种任务的需求都比较新颖、比较专,其代码很少需要复用。
下面就来介绍一下,针对这种任务为什么可以用Go语言来替代Python。

拥有编译器很方便

我经常在写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 你更喜欢谁?欢迎留言交流!

作者介绍:Jake Wilson,现任 SketchUp web team 技术经理,研究范围包括 HTML5、WebGL、Google Closure、Typescript、Java Redis 后端开发等,从事软件开发、硬件、产品、创业和激励方面的工作。他曾就职于 Boxuno.com、Monolla.com、谷歌等公司。在谷歌,他曾参与 Goole+、chrome、Webmaster Tools 等项目。

原文链接:https://thinkfaster.co/2018/07/goodbye-python-hello-go/

再见,Python!你好,Go语言\n\n相关推荐

  1. 再见python你好go语言_再见Shell,你好Python

    我最终还是决定放弃Shell,转而使用Python.这是为什么呢?来看看这篇博文,和我一起讨论吧! 作为一名职业程序员,我有多年编写Shell脚本的经验.你可能现在跟我面临着类似的情况.在Shell取 ...

  2. python实现sql数据处理_再见Python, 你好SQL

    原标题:再见Python, 你好SQL 雄凌求职:专注求职内推.金融名企实习内推的教育平台.可内推投行部.研究部门.互联网.私募.基金.四大.咨询等实习和工作岗位.专注大学生背景提升.工作求职.留学申 ...

  3. 再见, Python, 你好, Julia

    点击上方"Python高校",关注你的技术大学 来自:雷锋网公众号 随着 Python 的停滞不前,一个新的热门竞争对手出现了. 不要误解.Python 的受欢迎程度,仍然得到计算 ...

  4. 再见 Python,Hello Julia!

    作者 | Rhea Moutafis 译者 | 苏本如,责编 | 夕颜 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 随着Python的停滞不前,一个新的热门竞争对 ...

  5. 十月,再见;你好,十一月

    十月,再见! 十一月,你好! 2015年就剩最后两个月了. 曾经荒废时光的你,没时间遗憾,唯有追赶和改变. 总有人在你刷朋友圈的时候,苦练口语: 总有人在你打游戏时,坚持阅读: 总有人在你熟睡时,回想 ...

  6. 你好,再见;你好,幸会!

    做PBOC/EMV的L2认证,有接近七年了.一直就在这个圈子里兜兜转转,有做过终端认证,有做过卡片认证. 偶尔玩玩L3,玩玩PCI,玩玩工具开发,中间库开发. 技术来来去去也就是Linux + C , ...

  7. python比c语言开发速度快多少倍_Python语言其实很慢,为什么机器学习这种快速算法步骤通常还是用呢?...

    原标题:Python语言其实很慢,为什么机器学习这种快速算法步骤通常还是用呢? 作为python的忠实粉丝,看见这个题目就情不自禁想怼回去.鉴于和谐社会,我决定慢慢讲道理. 首先,相对于c语言,pyt ...

  8. python语言入门r_小结:jieba分词的Python与R语言基础用法介绍

    当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 人们说话不是一个词一个词崩出来的,文章也就由句子组成.要想让机器识别美文,体会中华名族汉语的博大精深,不是不可能.但是,首先需要将其转化成其 ...

  9. python与c语言数据交互,python与c语言交互应用实例

    1.python向c语言写数据 1) 先将接收端编译成一个共享链接库 gcc/arm-linux-gnueabihf-gcc -o bluetooth_proxy.so -shared -fPIC b ...

  10. 不是程序员学python有什么用-程序员的基本功:为什么非要用Python,其他语言不好吗?...

    原标题:程序员的基本功:为什么非要用Python,其他语言不好吗? Python能够这么火其中一个重要的原因是数据分析带起来的.Python的优点有很多,同样一个功能,其他语言需要写100行,而Pyt ...

最新文章

  1. 将二叉查找树转化为链表的代码实现
  2. ABAP知识:LIKE LINE OF 和LIKE TABLE OF
  3. 微软开放Holographic平台,意在统一VR的操作系统?
  4. mac系统如何在当前目录下打开终端
  5. Windows下根据进程id获得进程名
  6. java modbus通讯协议_Modbus通 讯 协 议
  7. 饥荒显示服务器建立时遇到问题,饥荒联机版建立服务器出现问题怎么回事 | 手游网游页游攻略大全...
  8. cpu开启超线程linux,Linux开发人员声称除非禁用超线程否则可以利用英特尔CPU
  9. 上线啦,PP.io!
  10. 徐张生:三级分销不是传销,人人店已经占据行业绝对优势
  11. 什么是企业邮箱?企业邮箱有什么用途?
  12. 阿里、腾讯、字节、京东、美团、百度......薪资职级大比拼
  13. 浅谈RESTful风格
  14. Ubuntu 14.04刷机时报错_BROM ERROR : S_UNDEFINED_ERROR (1001)
  15. 关于motionevent的使用
  16. android编译脚本下载,Android编译 Fak_aac心路历程
  17. c语言换行编辑,C语言怎么换行
  18. 面试题测试APP汇总:快快来收藏起来背背吧
  19. 【英语系列一】—量变到质变亲体验
  20. 如何判断一只股票已经建仓及训练完毕?--荐股王

热门文章

  1. Hadoop源码分析28 JobTracker 处理JobClient请求
  2. XMPP作为一个工具的意义
  3. [转载]DB2数据库移植罕见结果周全理会(3)
  4. BZOJ4519 CQOI2016不同的最小割(最小割+分治)
  5. 02-JAVA语法基础
  6. 笔记:Html.Partial和Html.Action
  7. freebsd安装ports
  8. c语言命名规则 [转载]
  9. python--过滤top命令--之--时间_系统CPU_进程CPU_内存
  10. blog迁来迁去的......