前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >译 - 为什么要学习Go?

译 - 为什么要学习Go?

作者头像
风清醉
发布2019-12-19 13:15:57
5900
发布2019-12-19 13:15:57
举报
文章被收录于专栏:小白的成长之路

“Go将成为未来的服务器语言。” — TobiasLütke,Shopify

在过去的几年中,出现了新的编程语言:Go或GoLang。没有什么比新的编程语言更使开发人员疯狂了,对吗?因此,我在4到5个月前开始学习Go语言,在这里我将告诉您为什么还要学习这种新语言。

我不会教你如何在本文中写“ Hello World !!”。在线上还有很多其他文章。我将解释计算机硬件软件的当前阶段,以及为什么我们需要像Go这样的新语言?因为如果没有问题,那么我们就不需要解决方案,对吗?

硬件限制:

摩尔定律失败了。 英特尔早在2004年推出了第一款时钟频率为3.0GHz的奔腾4处理器。今天,我的Mackbook Pro的时钟速度为2.9GHz。因此,近十年来,原始处理能力并没有获得太多收益。您可以在下表中看到随时间增加处理能力的比较。

从上面的图表中可以看到,单线程性能和处理器频率在近十年中一直保持稳定。如果您认为添加更多晶体管是解决方案,那么您错了。 这是因为在较小的规模上,一些量子特性开始出现(例如隧道效应),并且实际上放置更多晶体管的成本更高(为什么?),每美元可添加的晶体管数量开始下降。 因此,为了解决上述问题,

  • 制造商开始向处理器添加越来越多的内核。如今,我们有四核和八核CPU。
  • 我们还介绍了超线程。
  • 向处理器添加了更多缓存,以提高性能。

但是上述解决方案也有其 自身的局限性。由于缓存具有物理限制,因此无法向处理器添加越来越多的缓存来提高性能:缓存越大,缓存越慢。向处理器添加更多内核也有其成本。同样,这不能无限期地扩展。这些多核处理器可以同时运行多个线程,这带来了并发性。我们稍后再讨论。

因此,如果我们不能依靠硬件改进,唯一的方法就是使用更高效的软件来提高性能。但是可悲的是,现代编程语言效率不高。

“现代处理器就像是硝基燃料的有趣汽车,它们在四分之一英里处表现出色。不幸的是现代编程语言都像蒙特卡洛,他们充满曲折。” - 戴维·安加

去有goroutines!

如上所述,硬件制造商正在为处理器添加越来越多的内核,以提高性能。所有数据中心都在这些处理器上运行,我们应该期望在未来几年内内核数量会增加。更重要的是,当今的应用程序使用多个微服务来维护数据库连接,消息队列和维护缓存。因此,我们开发的软件和编程语言应轻松支持并发性,并且应随着内核数量的增加而扩展。

**但是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。**这些编程语言大多数都支持多线程。但是真正的问题在于并发执行,线程锁定,竞争条件和死锁。 这些事情使得在这些语言上创建多线程应用程序变得困难。

例如,在Java中创建新线程效率不高。由于每个线程消耗大约1MB的内存堆大小,最终如果您开始旋转数千个线程,它们将对堆施加巨大压力,并由于内存不足而导致关闭。另外,如果您想在两个或多个线程之间进行通信,则非常困难。

另一方面,Go于2009年发布,当时多核处理器已经可用。这就是为什么走的是与保持并发考虑建造。Go具有goroutines而不是线程。它们从堆中消耗了将近2KB的内存。所以,你可以随时旋转百万够程的。

`Goroutines如何工作?Reffrance:http ://golangtutorials.blogspot.in/2011/06/goroutines.html`

其他好处是:

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

您可以看到Rob Pike出色的通话并发性并不是并行机制,因此无法对此有更深入的了解。

以上所有这些,使Go在处理Java,C和C ++之类的并发性方面非常强大,同时保持了并发执行代码的平稳性和Erlang之类的美丽。

`Go兼顾了两个世界。易于编写并发并有效管理并发`

Go直接在基础硬件上运行。

与其他现代高级语言(例如Java / Python)相比,使用C,C ++的最大好处是它们的性能。因为C / C ++是经过编译而不进行解释的。

处理器了解二进制文件。通常,当您在编译项目时使用Java或其他基于JVM的语言构建应用程序时,它会将人类可读的代码编译为字节代码,而JVM或在底层OS之上运行的其他虚拟机可以理解这些代码。在执行时,VM解释这些字节码并将其转换为处理器可以理解的二进制文件。

`基于VM的语言的执行步骤`

另一方面,C / C ++无法在VM上执行,这从执行周期中删除了一个步骤,从而提高了性能。它直接将人类可读的代码编译为二进制文件。

但是,释放和分配这些语言中的变量是一个巨大的痛苦。大多数编程语言都使用垃圾收集器或引用计数算法来处理对象分配和删除。

Go带来了两全其美的优势。像C / C ++这样的低级语言一样,Go是编译语言。这意味着性能几乎接近低级语言。它还使用垃圾回收来分配和删除对象。因此,不再需要malloc()和free()语句!!!凉!!!

用Go编写的代码易于维护。

我告诉你一件事。Go没有像其他语言一样疯狂的编程语法。它具有非常简洁的语法。

Google Go语言的设计师在创建语言时就牢记这一点。由于google具有庞大的代码库,并且成千上万的开发人员正在同一个代码库上工作,因此对于其他开发人员而言,代码应易于理解,并且一段代码对另一段代码的影响应最小。这将使代码易于维护和修改。

Go故意遗漏了现代OOP语言的许多功能。

  • 没有课程。每件事都只分为包。Go只有结构而不是类。
  • 不支持继承。 这将使代码易于修改。在Java / Python之类的其他语言中,如果类ABC继承了类XYZ,并且您对类XYZ进行了一些更改,则在继承XYZ的其他类中可能会产生一些副作用。通过删除继承,Go还可轻松理解代码(因为在查看一段代码时没有要查看的超类)。
  • 没有构造函数。
  • 没有注释。
  • 没有泛型。
  • 没有例外。

上述变化使Go与其他语言完全不同,并且使Go编程也与其他语言不同。您可能不喜欢上面的几点。但是,这不像没有上述功能就无法编写应用程序。您所要做的就是再写2–3行。但从积极的方面来说,它将使您的代码更整洁,并为您的代码增加更多清晰度。

`代码可读性与效率`

上图显示Go几乎与C / C ++一样高效,同时使代码语法像Ruby,Python和其他语言一样简单。对于人类和加工者来说,这是双赢的局面!!!

与Swift等其他新语言不同,Go的语法非常稳定。自2012年首次公开发布1.0版以来,它一直保持不变。这使其向后兼容。

Go得到了Google的支持。

  • 我知道这不是直接的技术优势。但是,Go是由Google设计和支持的。Google拥有世界上最大的云基础架构之一,并且已大规模扩展。Go是Google设计的,旨在解决他们在支持可扩展性和有效性方面的问题。这些都是您在创建自己的服务器时将面临的相同问题。
  • 此外,诸如Adobe,BBC,IBM,Intel甚至Medium的一些大公司也使用Go 。(来源:https : //github.com/golang/go/wiki/GoUsers)

结论:

  • 尽管Go与其他面向对象的语言有很大不同,但它仍然是相同的野兽。Go为您提供了诸如C / C ++的高性能,为Java提供了超高效的并发处理,并为Python / Perl等代码带来了乐趣。
  • 如果您没有学习Go的计划,我仍然会说硬件限制给我们(软件开发人员)编写超高效代码的压力。开发人员需要了解硬件并相应地优化程序。经过优化的软件可以在更便宜,更慢的硬件(例如IOT设备)上运行,并且总体上对最终用户体验的影响更好。

———————————————— 版权声明:本文为博主「Keval Patel」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 硬件限制:
  • 去有goroutines!
  • Go直接在基础硬件上运行。
  • 用Go编写的代码易于维护。
  • Go得到了Google的支持。
  • 结论:
相关产品与服务
消息队列
腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档