阅读更多

4顶
2踩

互联网

转载新闻 为什么说2017年你必须要学习Go了

2017-01-18 10:38 by 副主编 jihong10102006 评论(0) 有8553人浏览
引用
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设备)以提升最终用户体验。
  • 大小: 247.3 KB
  • 大小: 73.2 KB
  • 大小: 79.2 KB
  • 大小: 19 KB
  • 大小: 17.9 KB
  • 大小: 63.6 KB
来自: Go中国
4
2
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 2017年Go语言入门教程

    Go语言入门教程,只要你懂中文都可以看的懂本套教程,为任何想学习Go语言研制的教程。

  • 为什么说 2017 年你必须要学习 Go 了

    为什么要学习Go ... 因此,我开始学习了一段时间Golang,在这里我将告诉你为什么你也应该学习这种新语言。 在本文里我不会告诉你怎么写hello world。 我要分析计算机硬件软件的当前阶段,以解释为什...

  • [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考“尚硅谷...

  • 2017年你应该学习的编程语言、框架和工具

    2017年你应该学习的编程语言、框架和工具 2016 年在开发者圈子中许多新的技术和概念层出不穷,人工智能、机器学习、Progressive Web Apps 等等,各种语言、框架和工具的更新也是让人看得眼花缭乱。2017 年,...

  • 为什么要学习Go语言

    因此,我开始学习了一段时间Golang,在这里我将告诉你为什么你也应该学习这种新语言。 在本文里我不会告诉你怎么写hello world。 我要分析计算机硬件软件的当前阶段,以解释为什么我们需要像Go这样的新语言? 硬件...

  • 编程语言排行榜2017_2017年要学习的5种新编程语言

    无论您是刚刚开始还是经验丰富的程序员,您最常问的问题可能是接下来要学习什么? 网络行业瞬息万变 ,您总是会发现一些新知识并有经验。但是,问题仍然在于如何选择下一种语言? 另请阅读: 学习编程:10个...

  • 2017年前端工程师应该学习什么

    翻译原文:2017年前端工程师应该学习什么 英文原文:2017 is the year that front-end developers should go back and master the basics 转载请注明出处,保留原文链接以及作者信息 在我们所生活的这个快节奏的...

  • 2017 年你应该学习的编程语言、框架和工具

    2016 年在开发者圈子中许多新的技术和概念层出不穷,人工智能、机器学习、Progressive Web Apps 等等,各种语言、框架和工具的更新也是让人看得眼花缭乱。2017 年,作为开发者应该跟随潮流还是理性选择新技术? ...

  • 2017 年你应该学习的编程语言、框架和工具(转)

    摘要: 2016 年在开发者圈子中许多新的技术和概念层出不穷,人工智能、机器学习、Progressive Web Apps 等等,各种语言、框架和工具的更新也是让人看得眼花缭乱。2017 年,作为开发者应该跟随潮流还是理性选择新技术...

  • Golang学习+深入(一)

    Go语言(简写:Golang)为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。API:Application Programming Interface:应用程序编程接口。

  • Go语言为什么值得学习?

    下面通过介绍我的亲身经历来介绍我为什么说 Go语言值得学习 我的经历 我是2015年夏天入行编程,使用Java语言做Android开发。15年正是创业热潮,那时候中关村创业大街如火如荼,那时候还没有小程序,出去玩就是地推...

  • GO笔记之为什么要学习GO

    新学一门语言,大家都想先弄清楚为什么要学它?玩知乎一段时间更是让我感受深刻,诸如 为什么要学习Python? 为什么要学习C? 为什么要学习Java? 之类问题经常出现在眼前。以前学语言时倒没怎么关心过这类问题。...

  • Go语言的2017年终总结

    写在前面\\Google 的 Go 语言团队会在 2018 年初宣布 Go 1.10 正式版的发布。10 这个二位数也预示着 Go 语言的进一步成熟。据说,Go 2 也被提上了日程。Go 2 将会是大神们对 Go 语言的一次彻底反思和改进。虽然现在...

  • Go 语言学习总结(8)—— Go 自学者必学的教程大纲

    Go语言是目前最受欢迎的语言之一,它具有入门快、程序库多、运行迅速等特点,很适合快速构建互联网软件产品,所以互联网大厂开始纷纷拥抱Go语言。根据《2021 年腾讯研发大数据报告》中显示,随着腾讯云计算和大数据...

  • 基于MRAS的感应电机无速度传感器矢量控制及速度估计技术解析

    内容概要:本文深入探讨了利用模型参考自适应系统(MRAS)实现感应电机无速度传感器矢量控制的方法。重点介绍了MRAS的工作原理,即通过电压模型作为参考模型,电流模型作为可调模型,在线比较两者输出误差并进行自适应调整,从而实现精确的速度估计。文中详细解释了关键代码实现,包括自适应律的设计、参数选择以及针对突加载工况的优化措施。同时讨论了实际应用中的调试技巧和注意事项,如积分饱和处理、参数辨识等问题。测试结果显示,相比传统方法,MRAS方案在突加载情况下表现出更好的鲁棒性和更快的响应速度。 适合人群:从事电机控制系统研究与开发的技术人员,尤其是关注无速度传感器矢量控制领域的工程师。 使用场景及目标:适用于需要提高感应电机控制系统性能的应用场合,特别是在无法安装物理速度传感器的情况下,通过软件算法实现高精度的速度估计。主要目标是降低硬件成本,增强系统的可靠性和环境适应性。 其他说明:文中提供了丰富的实验数据支持结论,并引用多篇权威文献作为理论依据。对于希望深入了解MRAS技术原理及其工程应用的读者来说,是一份非常有价值的参考资料。

  • 基于FPGA的AM调制解调全流程实现与优化

    内容概要:本文详细介绍了基于FPGA实现AM调制解调的全过程,涵盖从Matlab滤波器设计到Verilog代码实现,再到最终硬件测试的各个环节。首先,文章讲解了发射端的设计,包括载波生成和调制方法,采用DDS技术和定点运算提高效率。接着,深入探讨了接收端的关键技术,尤其是FIR滤波器的手工实现及其优化措施。文中还分享了许多实践经验,如时钟同步、数据位宽处理以及如何避免常见错误。最后,作者提供了完整的工程代码,并强调了动手实现而非调用IP核所带来的深刻理解和宝贵经验。 适合人群:具有一定FPGA开发基础的技术人员,尤其是对通信系统感兴趣的电子工程师。 使用场景及目标:适用于希望深入了解AM调制解调机制并在FPGA平台上进行相关实验的研究人员和技术爱好者。目标是掌握AM调制解调的具体实现步骤,理解各部分的工作原理,并能够独立完成类似项目的开发。 其他说明:文章不仅提供了详细的理论解释和技术细节,还包括了大量的实战经验和调试技巧,帮助读者更好地理解和应用所学知识。同时,所有源代码均已公开,方便读者下载学习。

  • BMS电池管理控制器开发板及其应用层软件开发全流程详解

    内容概要:本文详细介绍了BMS(电池管理系统)电池管理控制器开发板的相关内容,涵盖硬件部分的关键模块如电压采集模块、电流采集模块等,以及电池管理系统策略开发,包括充电策略、放电策略、电池均衡策略等。同时探讨了应用层软件的开发流程,从需求分析、架构设计、代码实现到最后的测试与优化,提供了丰富的实战经验和代码示例。此外,文中还涉及了一些具体的开发细节和技术难点,如ADC采样电路设计、SOC估算算法、HIL测试、故障注入测试等。 适合人群:从事电池管理系统开发的技术人员,尤其是有一定硬件和软件开发基础的研发人员。 使用场景及目标:适用于希望深入了解BMS开发板硬件设计、掌握电池管理系统策略制定方法、熟悉应用层软件开发流程的专业人士。目标是在实际项目中能够独立完成BMS系统的开发与优化。 其他说明:文中不仅提供了理论知识,还结合了大量的实战案例和代码片段,帮助读者更好地理解和应用相关技术。

  • 电力电子领域单相三电平NPC逆变器的载波层叠技术及SVPWM与SPWM调制策略解析

    内容概要:本文深入探讨了单相三电平NPC(Neutral Point Clamped)逆变器的技术特点及其主要调制策略。首先介绍了载波层叠技术,这是一种通过多个载波信号实现对逆变器输出电平精确控制的方法。接着分别讲解了SVPWM(空间矢量脉宽调制)和SPWM(正弦脉宽调制)这两种不同的调制方式,前者以电机磁链圆形旋转为目标,后者则是通过正弦波与三角波比较来决定输出电平。文中还提供了具体的C语言、Python和MATLAB代码示例,帮助读者更好地理解和实现这些调制方法。此外,文章讨论了不同调制方式之间的优缺点,并给出了实际应用场景的选择建议。 适合人群:从事电力电子研究的专业人士,尤其是那些希望深入了解单相三电平NPC逆变器及其调制策略的研究人员和技术人员。 使用场景及目标:适用于需要优化逆变器性能的设计项目,如工业自动化设备、新能源发电系统等。目标是在确保高效能的同时减少谐波失真,提高系统的稳定性和可靠性。 其他说明:文中引用了一些权威书籍和学术期刊作为参考资料,鼓励有兴趣进一步探索的读者查阅相关文献。同时强调了在实际应用中要考虑的因素,比如开关损耗、中性点电压平衡等问题。

  • COMSOL模拟超声清洗中28kHz压电片厚度与分布对声场强度影响的研究

    内容概要:本文详细探讨了利用COMSOL软件进行超声清洗模拟过程中,28kHz压电片的厚度和分布对声场强度的影响。研究表明,压电片的厚度变化显著影响声场强度,较薄的压电片能产生更强的声场。此外,压电片的不同分布方式也会导致声场分布的变化,均匀分布的压电片能使声场更加均匀,而集中分布则在某些区域产生更强的声场。文中还介绍了建模的关键步骤,包括物理场的选择、边界条件的设定以及网格划分的方法,并强调了考虑水的声阻尼和其他环境因素的重要性。 适合人群:从事超声清洗设备设计、优化及相关研究的技术人员和科研工作者。 使用场景及目标:①帮助研究人员理解压电片厚度和分布对声场强度的具体影响;②提供详细的建模方法和注意事项,以便更好地优化超声清洗设备的设计;③指导实际应用中如何选择合适的压电片参数以达到最佳清洗效果。 其他说明:文中提供了多个具体的MATLAB和COMSOL代码片段,用于展示如何在模拟中调整压电片参数并验证其对声场强度的影响。同时,作者分享了许多实践经验,指出了常见的错误和需要注意的地方。

Global site tag (gtag.js) - Google Analytics