0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go语言其实有很多优良特性,很多时候都可以代替Python

DPVg_AI_era 来源:lq 2019-02-13 10:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

出身名门的Go语言在诞生之初就吸引了大批开发者的关注。比起大家熟悉的Python,Go语言其实有很多优良特性,很多时候都可以代替Python。Go和Python你更喜欢谁?

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 等项目。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    10

    文章

    1965

    浏览量

    39884
  • python
    +关注

    关注

    58

    文章

    4889

    浏览量

    90326
  • go语言
    +关注

    关注

    1

    文章

    159

    浏览量

    9851

原文标题:再见,Python!你好,Go语言

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用PYTHON进行的跨平台仿真

    内部的解决方案,而且还允许跨平台模拟,以从其他程序或编程语言获益,并结合熟悉物理光学特性的VirtualLab Fusion,从而扩展模拟、优化、设计和后处理的选项。 因此,我们正在深入研究
    发表于 04-02 08:21

    同轴光源 细小划痕都可以被“看见”

    同轴光源可以对物体表面的微小不规则现象进行成像。
    的头像 发表于 01-09 17:40 331次阅读
    同轴光源 细小划痕<b class='flag-5'>都可以</b>被“看见”

    KIT_XMC14_2GO开发板:功能特性与硬件解析

    KIT_XMC14_2GO开发板:功能特性与硬件解析 在电子开发领域,一款性能出色且功能丰富的开发板对于工程师来说至关重要。今天,我们就来详细探讨一下KIT_XMC14_2GO开发板,它配备了英飞凌
    的头像 发表于 12-19 10:20 617次阅读

    C与C++之间的联系

    1、语法兼容性: C++完全兼容C语言的语法,这意味着任何有效的C语言程序都可以直接在C++编译器下编译通过。 2、底层控制: C++虽然增加了许多高级特性,但它仍然保持了对硬件
    发表于 12-11 06:51

    深度休眠状态下外部所有的IO都可以唤醒MCU吗?

    深度休眠状态下,外部所有的IO都可以唤醒MCU吗?
    发表于 12-04 06:00

    请问CW32L010是低功耗下2个串口都可以使用吗?

    CW32L010是低功耗下2个串口都可以使用吗?
    发表于 12-01 07:07

    为什么单片机还在用C语言编程?

    说起单片机我们就会想到C语言,单片机为什么还在用C语言编程?现在有很多很好用的高级语言,如VC、PYTHON、PHP等等,为什么这些
    发表于 11-28 07:37

    C语言特性

    根据硬件的差异对少量的底层驱动代码进行调整,大大降低了开发成本和周期。 3、灵活性:底层操作的能手 C 语言支持对底层硬件的直接操作,赋予了开发者极大的灵活性。开发者可以通过指针等特性,直接
    发表于 11-24 07:01

    请问CW32的pwm移相功能是只有PWM通道1有还是全部都可以配置?

    请问CW32的pwm移相功能是只有PWM通道1有还是全部都可以配置?做三相移相时需不需要额外的处理?
    发表于 11-21 06:22

    Linux 编程语言盘点:从内核到AI的全栈选择

    在工控圈和嵌入式圈里,有一个常年被讨论的问题:  “在 Linux 上,到底该用什么语言编程?” 有人坚信:C 才是真正的工业语言。有人反驳:Python 才是效率王者。还有人推崇 Go
    的头像 发表于 11-06 17:05 795次阅读

    语音播报芯片:让产品“开口说话”的秘密

    不知道大家发现没有,在我们的日常生活当中,其实有很多会“说话”的产品,比如我们日常骑行电动自行车,在没电的时候它会通过语音播报提醒你“电量低请及时充电”。在便利店或者很多餐饮商家付款的
    的头像 发表于 09-28 09:28 739次阅读
    语音播报芯片:让产品“开口说话”的秘密

    NuMicro 中的每个 ADC 通道都可以吗?

    NuMicro 中的每个 ADC 通道都可以吗?具有相同模块的系列微控制器同时采样?
    发表于 08-22 06:29

    C++ 与 Python:树莓派上哪种语言更优?

    Python是树莓派上的首选编程语言,我们的大部分教程都使用它。然而,C++在物联网项目中同样广受欢迎且功能强大。那么,在树莓派项目中选择哪种语言更合适呢?Python因其简洁性、丰富
    的头像 发表于 07-24 15:32 1128次阅读
    C++ 与 <b class='flag-5'>Python</b>:树莓派上哪种<b class='flag-5'>语言</b>更优?

    【正点原子STM32MP257开发板试用】3.响起蜂鸣器

    蜂鸣器代替LED,而且项目正好需要使用蜂鸣器。 使用库 Python很多可以使用GPIO的库,比较常见的应该是gpiod这个库了,它可以
    发表于 06-15 15:13

    跟老齐学Python:从入门到精通

    础的学习者介绍一门时下比较流行、并且用途比较广泛的编程语言,所以,本书读起来不晦涩,并且在其中穿插了很多貌似与Python 编程无关,但与学习者未来程序员职业生涯有关的内容。 获取完整文档资料可下载附件哦!!!! 如果内容
    发表于 06-03 16:10