为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论

为什么要学习Go

Go是未来的服务端语言—?Tobias Lütke, Shopify。在过去的几年中,Golang逐步流行起来。 还有什么能比一门新语言让码农们疯狂呢? 因此,我开始学习了一段时间Golang,在这里我将告诉你为什么你也应该学习这种新语言。 在本文里我不会告诉你怎么写hello world。 我要分析计算机硬件软件的当前阶段,以解释为什么我们需要像Go这样的新语言?

硬件限制

摩尔定律正在失效 第一个具有3.0GHz时钟速度的Pentium 4处理器是由英特尔于2004年推出的。 而今天,我的Mackbook Pro 2016的CPU时钟速度为2.9GHz。 可以看到在过去的十年中,CPU处理能力没有太大的进步。 您可以在下面的图表中看到这一点。

从上面的图表可以看出,单线程的性能和处理器的频率在过去的十年内保持平稳。如果你认为添加更多的晶体管是解决方案,那么你错了。这是因为在较小的尺度上一些量子性质开始出现(如隧道,因为它实际上用掉更多的更多的晶体管(为什么?)并且添加晶体管的性价比在下降。 所以制造商开始向处理器添加越来越多的核心。现在我们有四核和八核CPU可用。 同时我们还引入了超线程。还向处理器添加更多缓存以提高性能。 但上述解决方案也有其局限性。我们不能向处理器添加更多的缓存以提高性能,因为缓存具有物理限制:缓存越大,缓存越慢。向处理器添加更多核心也具有成本。此外,这都不能无限扩展。这些多核处理器可以同时运行多个线程,并在纸面上带来并发性。我们稍后将讨论这一问题。 所以,如果我们不能完全依靠硬件的改进来提升性能,更高效的软件也是我们需要考虑的手段。但遗憾的是,现代编程语言并不高效。

Go has goroutines!!

如上所述,硬件制造商正在向处理器添加越来越多的核心以提高性能。使用这些处理器的所有数据中心,在未来几年内核数量将会大大增加。更重要的是,今天的应用程序使用多个微服务来维护数据库连接,消息队列和缓存。因此,我们开发的软件和编程语言应该轻松支持并发性,并且它们应该随着核心数量的增加而轻松扩展。 但是,大多数现代编程语言(如Java,Python等)发明于90年代的单线程环境。当然这并不意味着他们不支持多线程(译者的话Python确实不支持多线程)。大多数编程语言支持多线程。真正的问题来自并发执行和线程锁,竞争条件和死锁。这些东西使得在这些语言上创建多线程应用程序很困难。 例如,在Java中创建新线程会消耗大约1MB的内存堆大小。最终如果你创建了数千个线程,这将对堆内存造成巨大的压力,并将由于内存不足而被操作系统杀死。此外,如果你想在两个或多个线程之间进行通信,也比较困难。 另一方面,Go在2009年发布时,多核处理器已经流行起来。这就是为什么GoLang以并发为第一要务。 Go使用goroutines而不是线程。新建goroutine只使用近2KB的内存,你可以创建数百万goroutine。

当然还有其他的好处:

  • 具有可增长的分段堆。这意味着他们只在需要时才使用更多的内存。
  • Goroutines的启动时间比线程快。
  • Goroutines带有内置的原语,以便在它们之间(channel)安全地通信。
  • Goroutines允许您避免在共享数据结构时使用互斥锁。
  • 此外,goroutines和OS线程不是1:1映射。 单个goroutine可以在多个线程上运行。 Goroutine被复用到少量的OS线程中。

以上几点,使Go非常强大,可以在处理并发(如Java、C和C++)的同时保持代码的优雅(像Earlang)。

Go直接运行在硬件上

使用C、C ++的一个最大的好处是它们的性能比其他现代高级语言(如Java / Python)更强。 因为C / C ++是编译执行而不是解释执行的。 当您使用Java或其他基于JVM的语言构建应用程序时,它将代码编译为字节码,在执行时,JVM解释字节码并将其转换为处理器可以理解的二进制代码。

而C、C 不在VM上执行,从执行周期中删除一个步骤,并提高了性能。 他们直接将代码编译成二进制代码。

但是在C/C中释放和分配内存太过痛苦。 即使大多数编程语言可以使用垃圾收集器或引用计数算法处理对象分配和删除。 Go同时拥有上面提到的好处。 Go是像C/C++这样的低级语言并且是编译型语言。 这意味着它的性能几乎更接近低级语言。 并且Go还使用垃圾回收来分配和释放内存。 所以不需要malloc和free!!!

Go代码容易维护

Go有着非常整洁和干净的语法。Go的设计者在创建语言时考虑到了这一点。 由于google有非常大的代码库,成千上万的开发人员正在使用同一个代码库,代码应该易于其他开发人员理解。这将使代码易于维护和修改。 Go故意去掉了很多现代OOP语言具有的功能。

  • 没有类。 Go只有结构体而不是类。
  • 不支持继承。 这将使代码容易修改。 在其他语言(如Java / Python)中,如果ABC类继承了类XYZ,并且在类XYZ中进行了一些更改,那么这可能会在继承XYZ的其他类中产生一些副作用。 通过删除继承,Go使得很容易理解代码(因为没有超类)。
  • 没有构造函数。
  • 无注解(annotation)。
  • 没有泛型(generics)。
  • 没有异常。

以上的差异使Go与其他语言非常不同。 当然你可能不喜欢上面的一些点。 但是,在没有上述功能的情况下 你需要做的仅仅是多写2-3行代码。 然而这样会使你的代码更加简洁易懂。

上图显示Go几乎与C/C++一样高效,同时保持代码语法简单,如同Ruby,Python。 这是一个对人类和机器来说双赢的局面! 与其他新语言(像Swift)不同,Go的语法非常稳定。 自从2012年首次公开发布1.0版以来,它保持不变。这使得它向下兼容。

Go的背后是Google

  • 虽然这不是直接的技术优势。 但Go是由Google设计和支持的。 Google拥有世界上最大的云基础架构之一,并且可以大规模扩展。Go是由Google设计的,以解决他们需要的可扩展性性问题。这些也是你在创建自己的服务时将面临的问题。
  • Go也被一些大公司使用,如Adobe,BBC,IBM,英特尔等等。

结论

  • 即使Go和其他面向对象的语言非常不同,但它同时为您提供高性能(如C/C++),超级好用的并发处理(如Java)和简洁的代码(如Python/Perl)。
  • 如果你没有任何计划学习Go,我还是会说软件开发人员需要写出超高效的代码。开发人员需要了解硬件并相应地优化程序。优化软件以运行在更便宜和更慢的硬件(如IOT设备)以提升最终用户体验。

稿源:Go中国

http://www.oschina.net/news/80938/why-2017-you-have-to-learn-go

说句实话,你才学了多少 GO 多少语言,看点皮毛就觉得激动。论性能,GO 比 Erlang、Rust、Nim、Crystal 差远了,论快捷比 Nodejs 哪怕是 PHP 7 差了十万八千里,尤其是 Nodejs 不仅仅 HTML5 后端一条龙,现在 NW 和 Electron 使得桌面应用也能 JS 一条龙。论生态比 Java、Python、Nodejs 更是差了十万八千里。论语法,连 C++ 都不如,别的就不用比了。最后,连 TypeScript 的静态编译语法都比 GO 强几百倍。GO 是个毫无语言设计概念的人写出来的,毕竟 C 语言当年他只是个参与者,不是设计者。补充:Go 的 goroutine 就是 Java 的 NIO,Nodejs 的 libuv 和 async await,甚至 C# 的 async await 都是这种概念,Nim 的 async await 以及 C++ 的 Future 都是一个东西。GO 就没啥别的语言是没有的。

看到很多人喷golang,说说我的看法吧,建议亲自使用golang开发项目后再发表评论。我个人开发过几个Golang项目,感觉并不比其他语言差,效率也足够快。
golang贵在简洁性、新生,这就注定要比其他语言老牌优秀,因为其他语言历史遗留问题很多。例如php开发个web需要考虑各种框架(我之前是自己写的框架,开发效率并没有想象中那么快),而golang原生http库就能解决大部分应用场景了。
很多先进、优秀的产品都出自优秀的开发者,因为这部分人会不断去尝试新的东西,不断更新自己的知识库,而非闭门造车、固步自封。
例如,国人开发的gogs,基本能替代了gitlab;docker就不用多说了。。
最后,编程语言并没有什么差别,关键看用的人。

时间: 2024-10-26 13:47:00

为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论的相关文章

2017年11月11日软考网络工程师案例分析真题及答案解析

[徐朋出品,必属精品]软考徐朋老师全网最先发布2017年11月11日软考网络工程师案例分析真题及答案解析,是全网最清新版本.详细讲解了2017年11月11日最新开考的软考网络工程师案例分析真题及答案.课件中对每一道真题都进行了详细的解析讲解,考后几周是学员记忆答案的最关键时间点,第一时间发布真题及答案帮助广大考生准确评估自己的考试结果及对未来参加考试的学员展示最新的考试趋势等.下载地址:http://down.51cto.com/data/2340424

2017年高考来袭,新乡亿丰网络陪你们一起答题

今天是2017年6月7日,高考第一天,新乡亿丰网络在这里首先要祝全国的考生们考试顺利.心想事成.现在时间来到了上午9点10分,不知道大家的语文选择题做到第几个了呢?听说,今年高考连瓶水都不让带了呢!还有的新闻报道,忘记带准考证的同学也不用着急下跪了,考点有你的信息资料的,只要对照吻合就必须放你进场的,当然,下一场依然要带上你的准考证的.不说了,我们亿丰网络也要答题了,幸运的是只有几道选择题,来来来,我们比比看谁先交卷呀. 1.你常用的SEO综合工具有哪些? A.百度站长平台 B.360搜索站长平

Android组件化方案

1为什么要项目组件化 2如何组件化 3组件化实施流程 1组件模式和集成模式的转换 2组件之间AndroidManifest合并问题 3全局Context的获取及组件数据初始化 4library依赖问题 5组件之间调用和通信 6组件之间资源名冲突 4组件化项目的工程类型 1app壳工程 2功能组件和Common组件 2业务组件和Main组件 5组件化项目的混淆方案 6工程的buildgradle和gradleproperties文件 1组件化工程的buildgradle文件 2组件化工程的grad

2017广东省红帽杯网络安全攻防大赛writeup

签到 扫码按操作即得 brian(Y) 打开题目,发现是一段字符: +++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.< ++++[ ->+++ +<]>+ +++.< ++++[ ->--- -<]>- ----- .<+++ +++[- >---- --<]> ----- ----- -.+.- ..

2017 框架、框架、类库、类库,web前端应该学什么 ?

在当今的快节奏生态中,有人倾向于花时间尝试最新框架,最新的类库,新奇有趣的插件.. 但我们的确应该把脚步放慢一些,并认真了解那些不会有很大变化的事情(理论本质).这样不仅会提升我们的工作质量和我们所创造的价值 -- 还将切实地帮助我们更快理解这些新的工具. ### 如何写出可读性高的代码 我们多数的工作并不是编写新代码,而是维护已有代码.这意味着你最终阅读代码的时间要比编写它所花费的时间要长,所以你需要为之后需要阅读你代码的程序员优化代码,而不是为了解释器. 这里我建议你按以下顺序 - 由浅入深

Visual Studio 2017 发布

https://www.visualstudio.com/zh-cn/news/releasenotes/vs2017-relnotes 发布日期:2017 年 3 月 7 日 摘要 开发:快速导航.编写并修复代码 新的安装体验 - 降低了最小内存需求量以实现更快.更定制化的安装,并且支持脱机安装. Visual Studio IDE - 大幅改进了 Visual Studio 2017,包括减少启动和解决方案加载时间.改进登录和标识.改进代码导航以及增添打开文件视图和链接的服务,实现了应用和任

2017工作计划

看了博友发表的一篇2017年计划之后,发现自己也应该列下计划,2017不能再碌碌无为. 1.巩固java基础,对语言要有自己的一些见解. 2.学习三大框架,通过项目进行实践,不能浮于表面. 3.算法学习从头开始. 4.如果没有新的项目,应该把之前的两个小项目进行代码重构. 5.选择最优,而不是将就. 6.在自身的运维工作中提出一些建设性的建议,提升所运维系统的稳定性.可靠性.易用性以及乐用性. 7.读20本书. 8.找到自身的定位,不再迷茫. 记2017年1月25日22:30分 柠檬人.

2017 UESTC Training for Dynamic Programming

2017 UESTC Training for Dynamic Programming A    思维, 或 dp, 很有意思 方法1: 构造法:蛇形安排赛程表算法复杂度:O(N^2)将1-N排成两竖列,每一轮同一行的为对手保持1的位置不变,其他位置按顺(逆)时方向依次旋转1    6          1    2          1    3          1    4          1    5      2    5          3    6          4   

2017 正确的学习姿势

测试到底如何学习? 如果你是以下这几条里中枪的,那么后面的内容对你来说多少是有用的. 1. 虽然想学点东西,身边没任何资源,毫无方向 2. 好像学的东西都很简单,总自以为都会了 3. 学到的总是皮毛,无法结合到一起,不成体系 4. 学是学了,但项目中就用不上 直入正题,从常见的测试技术方向来谈谈,到底怎么样学习才是正确的姿态,避免入坑又没学到什么,能发挥出来才是硬道理,这波先大致来看看有些什么,有机会再深入探讨. (功能测试.自动化测试.接口测试.性能测试.安全测试) 功能测试 为什么有功能测试