微信搜索【吴亲强的深夜食堂】公众号,分享一下奇奇怪怪的设计,关注我,获取更多学习资料

这是一篇译文,原文地址在[99]。这篇文章虽然写于2017年,今天依然值得一看。

Go 将是未来的服务端语言。 --- Tobias Lütke, Shopify(注:Tobias Lütke 是 Shopify 创始人)

在过去的几年中,有一门崛起的语言:Go 或者 GoLang。没有什么比一门新编程语言更能让开发者兴奋了,对不对?因此,我大概 4 、5 个月之前就开始学 Go 了。接下来,我将告诉你,为什么你需要去学习这门新语言。

我并不打算教你如何写「Hello World!!」。网上有很多教程会告诉你。我主要想阐述当今软硬件发展的现状以及为什么我们需要学习像 Go 这样的新兴语言?如果没有任何问题,我们也不需要解决方案,对吧?

硬件的局限性

摩尔定律正在失效。

英特尔于 2004 年发布了第一款具有 3.0GHz 时钟速率的 Pentium 4 处理器。如今,我的 Mackbook Pro 2016  的时钟速率是 2.9GHz。因此,在过去的十年间, CPU 的处理能力没有太大的发展。

你可以从下图中看到处理能力的增长和时间的关系。

可以看出看到,在过去十年间,单线程的性能和处理器的速率保持稳定。如果你认为增加更多晶体管的数量是解决问题的一种方法,那么你错了。这是因为在微观尺度上,量子特性开始显现(如:量子隧道穿越效应),这就导致放置更多晶体管代价也会更大(为什么[1]),并且每美元增加晶体管的数量也在下降。

所以,为解决上述问题:

  • 制造商开始向处理器添加更多的内核。如今,我们有四核和八核 CPU 可用。

  • 我们还引入了超线程技术。

  • 为处理器添加更多缓存以提高性能。

但是以上解决方案也存在局限性。我们无法通过对处理器添加更多的缓存来提高其性能,因为缓存本身具有物理特性限制:缓存越大,速度越慢。对应的,向处理器添加更多的内核一样有其成本。而且,这也不能无限扩展。这些多核处理器同时执行多个线程,也带来了并发性。我们稍后再讨论这个问题。

因此,如果我们不能依赖于硬件去改进,剩下的出路就是从更高效的软件来提升性能,但遗憾的是,现代编程语言都不是那么高效。

「现代处理器就像一辆有氮气加速系统的直线竞速竞速车,他们在四分之一英里直线加速赛表现卓越。但是不幸的是现代编程语言却像蒙特卡洛的 F1 赛道,迂回曲折。」 --- David Ungar

Go 拥有 goroutine !!

如上所述,硬件制造商正在向处理器添加更多的内核以提高性能 。所有的数据中心都运行在这些处理器上,我们预计在接下来的几年,内核的数量将会增加。更重要的是, 如今的应用程序都是使用多个微服务来维持数据库连接、消息队列和缓存。因此,我们开发的软件和编程语言应该更容易的支持并发,并且能随着内核数量的增加而可伸缩。

但是, 大多数的现代编程语言(如 Java,Python等)诞生于上世纪 90 年代的单线程环境。虽然大多数的编程语言支持多线程,但是真正的问题是并发执行、线程锁、竞争条件和死锁。这些问题导致使用这些编程语言创建多线程应用程序相当困难。

举例来说,在 Java 中创建新线程会消耗大量内存。因为每个线程大约会消耗 1 MB 的堆内存,当你运行上千个线程,它们将对堆内存造成极大的压力,最终可能会因内存不足而宕机。此外,如果你想让两个以上的线程之间互相通信,也是非常困难的。

另一方面,早在 Go 发布之初(2009 年),就已经存在多核处理器了。这也是为什么 Go 是考虑在并发的基础上构建的。Go 使用 goroutine 来代替线程。每个 goroutine 大概消耗 2KB 的内存。因此,在任意时刻都可以随时启动百万个 goroutine 。

Goroutine 如何工作?[2]

另外,还有如下优点:

  • Goroutine 拥有有可增长的分段堆栈。这意味着它们仅在需要时才使用更多的内存。

  • Goroutine 比线程启动的更快。

  • Goroutine 拥有内置原语,以便他们在(channel)之间安全的进行通信。

  • Goroutine 允许你在使用共享资源时,避免使用互斥锁。

  • 此外,goroutine 和 OS 线程不是 1:1 的映射 。单个 goroutine 可以在多个线程上运行。Goroutine 也能被复用到少量的 OS 线程中。

推荐去看 Rob Pike's 的演讲: 并发不是并行[3] ,加深理解。

以上这些点,能让 Go 像 Java,C 和 C++ 一样拥有强大的并发处理能力,同时又能像 Erlang 一样优雅的执行代码。

Go 可以兼顾:易于编写并发和高效管理并发。


Go 直接运行在底层硬件上。

C , C++ 优于其他现代高级语言(如 Java / Python)最大原因是它们的性能。因为 C/C++ 是编译型语言而不是解释型语言。

处理器能理解二进制文件。通常来说,当编译一个 Java 或其它基于 JVM 语言构建的应用程序时,是将人类可读的代码编译为字节代码, 这可以被 JVM 或其它运行在底层操作系统之上的虚拟机所理解。当执行的时候, 虚拟机解释这些字节码并将它们转换为能被处理器理解的二进制文件。

基于虚拟机语言的执行步骤。

C/C++ 并不在虚拟机上执行,省去了这一步从而提升了性能。C/C++ 是直接将人类可读的代码编译成二进制文件。

但是,使用这些 C/C++ 语言,释放和分配变量是一件很痛苦的事。而其他大部分语言都可以使用垃圾收集器和引用计数的算法来处理对象分配和回收。

Go 两者都能满足。它和 C/C++ 等语言一样,是编译型语言。这意味着它的性能几乎和低级别语言一样强悍。同时,Go 也具备垃圾回收机制。因此,不需要使用 malloc () 和 free () 之类的语句了!!!这酷毙了!!!


Go 编写的代码易于维护

Go 并没有像其他语言那样有各种复杂的语法,它的语法非常简洁。

Go 语言的缔造者在创建之初就考虑到这一点。由于 Google 拥有海量的代码库,成千上万的开发者都使用着相同的代码库,因此代码理应让其他开发者能更好的理解,一段代码的修改对另一段代码副作用应该保持最小,这样才能使代码更加易于维护和修改。

Go 舍弃了现代面向对象语言的一些特性。

  • 没有类。所有代码都被划分到包(package)中。Go 只有结构体而不是类。

  • 不支持继承。这就使得代码易于修改。在其他语言例如 Java/Python ,如果类 ABC 继承了类 XYZ ,当你改动类 XYZ, 就会对继承了 XYZ 的其他子类产生影响。通过移除继承,Go 使得代码变得易懂 (查看一段代码时不必去追父类)

  • 没有构造方法。

  • 没有注解。

  • 没有泛型。

  • 没有异常。

上述的这些改变使得 Go 和其他语言的编程风格截然不同。你可能不太喜欢。但是,并不是说没有上述这些特性,就没法为应用程序编码了。你要做的就是多写几行代码。从好的方面看,它将使你的代码更加清晰。

代码的可读性 vs 执行效率。

如上所示, Go 执行效率直逼 C/C++,同时像 Ruby, Python 之类的语言一样保持语法的简洁。

与 Swift 等这些新的语言不一样,Go 的语法非常稳定。自 2012 年发布以来,保持不变并且向后兼容。

Go 背后是 Google。

  • 我知道这并非是一个很直接的技术优势。但 Go 是由 Google 设计并支持的。Google 是全球最大的云基础架构商之一,其规模庞大。Go 由 Google 设计,旨在解决其可扩展性和效率问题。这些都是在我们创建自己的服务器时需要去面对的问题。

  • 更重要的一点, Go 同样也被一些诸如 Adobe、BBC、IBM、 Intel 、 Medium [4] 这类大公司使用。

结语

  • 尽管 Go 和其他面向对象型语言非常不同,但是 Go 拥有 C/C++ 一样的高性能,像 Java 一样高效的并发处理以及 Python/Perl 一样有趣的编码乐趣。

  • 如果你没有学习 Go 的计划,我仍旧会告诉你,硬件的限制会给我们带来压力,软件开发者应该编写超高效的代码。开发者应该理解硬件并尽可能地优化他们的程序。优化过的程序可以运行在更廉价或者更慢的机器上 (例如 IOT 设备), 并且整体上对用户体验会产生更好的影响。

参考文献

  • GoLang 或未来开发者 [5]

  • 用 Go 编写下一代服务器 [6]

  • 并发不是并行 由 Rob Pike 创作[7]

  • 为什么是 Go?[8]

附录

[99]

原文连接:

https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65[1]

为什么?: https://www.quora.com/What-is-Quantum-Tunneling-Limit-How-does-it-limit-the-size-of-a-transistor

[2]

goroutine 是如何工作: http://golangtutorials.blogspot.in/2011/06/goroutines.html

[3]

并发不是并行: https://blog.golang.org/concurrency-is-not-parallelism

[4]

go大企业使用名单:https://github.com/golang/go/wiki/GoUsers

[5]

Golang或未来开发者 hhttps://medium.com/@edoardo849

[6]

用 Go 编写下一代服务器: https://www.youtube.com/watch?v=5bYO60-qYOI

[7]

并发不是并行: https://vimeo.com/49718712[8]

为什么是 Go?: https://nathany.com/why-go/

如果文章对你有所帮助,点赞、转发、留言都是一种支持!

为什么你需要学 Go?相关推荐

  1. 关于新技术的引入原则 ——从零开始学架构

    不以解决实际问题引入的技术都耍流氓. 新技术的引入不是为了证明自己,而是为了解决实际项目中遇到的问题.希望诸位能够控制住自己的心魔. 新技术的引入要求应该是解决的问题大于带来的问题. 再引入新技术,请 ...

  2. Java学到什么水平能够出去找工作!

    Java学到什么水平能够出去找工作!搞定这些技术吧! 1.JavaSE内容 环境搭建,基础语法,面向对象,数组,集合,常用API,IO流,反射机制,多线程,网络编程 要求: 利用这些基础知识,写出一个 ...

  3. 合肥工业大学—SQL Server数据库实验五:创建和删除索引

    创建和删除索引 1. 用SQL语句建立索引 2. 用SQL语句删除索引Stuspno 1. 用SQL语句建立索引 (1)应用场景:在教务管理系统中,经常需要通过学生的姓名查询学生的基本信息,学生人数大 ...

  4. 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表

    SQL语句创建和删除基本表 1. 编写6个基本表 2. 修改基本表结构,完整性约束条件 3. 用Drop table 语句删除基本表 1. 编写6个基本表 设有简单教学管理的6个关系模式如下: 系(系 ...

  5. 零起点学算法104——第几天?

    零起点学算法104--第几天? Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lld Description 给定一个日期,输 ...

  6. 零起点学算法24——求正弦和余弦

    零起点学算法24--求正弦和余弦 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Description 输入一个正整数n ...

  7. 零起点学算法22——华氏摄氏温度转换

    零起点学算法22--华氏摄氏温度转换 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Description 输入一个华氏 ...

  8. 零起点学算法17——比较2个数大小

    零起点学算法17--比较2个数大小 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Description 输入2个整数, ...

  9. 零起点学算法11——求梯形面积

    零起点学算法11--求梯形面积 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Description 水题 Input ...

  10. 零起点学算法10——求圆柱体的表面积

    零起点学算法10--求圆柱体的表面积 Description 很简单的问题,求圆柱体的表面积 Input 多组测试数据,每组输入底面半径r和高h Output 每组输出圆柱体的表面积,保留3位小数 S ...

最新文章

  1. python beautifulsoup模拟点击_Python爬虫丨BeautifulSoup实践
  2. 谈谈Java接口Result设计
  3. P1984 [SDOI2008]烧水问题
  4. docker 查看已安装容器_WIN7下安装Docker容器
  5. 一步一步理解GB、GBDT、xgboost
  6. 通过按Enter阻止用户提交表单
  7. 数学建模竞赛大汇总,别再被野鸡竞赛坑啦
  8. AUTOCAD——表格样式
  9. 涉密计算机涉密存储设备或者改作其他用途的,将未经安全技术处理的退出使用的涉密计算机涉密存储设备或者改作其他用途的依法给予处分...
  10. qiniuLive 连麦流程介绍
  11. Flutter 全能型选手GetX —— 简介
  12. 计算机网络之物理层-频带传输
  13. 计算机性能指标ppt,计算机网络—评价网络的性能指标知识讲解.ppt
  14. github-创建新branch
  15. 百度云服务器Ubuntu18.04部署web项目
  16. matlab sym t,matlab的符号变量sym,syms-Go语言中文社区
  17. 戴尔服务器安全模式进不去系统,安全模式进不去
  18. 数字化工厂车间条形码应用视频
  19. 安恒信息HWS计划2021硬件冬令营 物联网安全课堂笔记 2021.1.10
  20. 计算机毕业设计springboot教务管理系统l7srg源码+系统+程序+lw文档+部署

热门文章

  1. 数字人民币试点目前呈现“全面开花”态势
  2. 关于使用anaconda安装package出现CondaHTTPError问题
  3. 【装修选材】自然系原木,才是空间真正的百搭之王!
  4. 计算机网络安全控制技术
  5. QT-3-基本组件2
  6. 阿里云短信设置流程图文介绍
  7. 2022-2027年中国旅游地产行业发展前景及投资战略咨询报告
  8. 1800勘误表_专业的ASP.NET 2.0勘误表
  9. Android获取软键盘输入内容
  10. 基于北斗导航定位系统的设计与实现(论文+程序设计源码+数据库文件)