首页 > 其他分享 >0为什么你应该学习Go语言

0为什么你应该学习Go语言

时间:2023-11-03 09:34:05浏览次数:44  
标签:Java 语言 性能 goroutine 学习 处理器 Go

终于等到你!Go语言——让你用写Python代码的开发效率编写C语言代码。

为什么互联网世界需要Go语言

世界上已经有太多太多的编程语言了,为什么又出来一个Go语言?

硬件限制:摩尔定律已然失效

摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。

img

从上面的图表可以看出,近十年单线程性能和处理器频率保持稳定。我们不能像之前一样把添加更多晶体管当成是解决方案,因为在较小规模上一些量子特性开始出现(如隧道效应),并且因为在同样小的空间里放置更多晶体管的代价非常昂贵,每1美元可以添加的晶体管数量开始下降。

制造商开始从其他方面提高处理器的性能:

  1. 向处理器添加越来越多的内核,如四核和八核CPU。
  2. 发明了超线程技术。
  3. 为处理器添加了更多缓存以提高性能。

但上述解决方案也有其自身的局限性。因为成本原因我们不能无限制的为计算机添加内核,也无法无限制的添加缓存来提高性能,因为缓存越大,取值的性能越低。

我们没有办法在硬件上一直取得突破,我们需要提高软件的性能或者说我们需要高性能的软件。

Go语言为并发而生

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

但是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的运行原理后才能熟练掌握。

Go于2009年发布,当时多核处理器已经上市。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。

很多公司,特别是中国的互联网公司,即将或者已经完成了使用 Go 语言改造旧系统的过程。经过 Go 语言重构的系统能使用更少的硬件资源获得更高的并发和I/O吞吐表现。充分挖掘硬件设备的潜力也满足当前精细化运营的市场大环境。

Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine

goroutine的特点:

  1. goroutine具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。
  2. goroutine的启动时间比线程快。
  3. goroutine原生支持利用channel安全地进行通信。
  4. goroutine共享数据结构时无需使用互斥锁。

Go性能强悍

与其他现代高级语言(如Java/Python)相比,使用C,C++的最大好处是它们的性能。因为C/ C++是编译型语言而不是解释的语言。 处理器只能理解二进制文件,Java和Python这种高级语言在运行的时候需要先将人类可读的代码翻译成字节码,然后由专门的解释器再转变成处理器可以理解的二进制文件。-w839同C,C++一样,Go语言也是编译型的语言,它直接将人类可读的代码编译成了处理器可以直接运行的二进制文件,执行效率更高,性能更好。-w1112数据来源:https://benchmarksgame-team.pages.debian.net/benchmarksgame/

可以看出,Go 语言在性能上更接近于 Java 语言,虽然在某些测试用例上不如经过多年优化的 Java 语言,但毕竟 Java 语言已经经历了多年的积累和优化。Go 语言在未来的版本中会通过不断的版本优化提高单核运行性能。

Go语言简单易学

语法简洁

Go 语言简单易学,学习曲线平缓,不需要像 C/C++ 语言动辄需要两到三年的学习期。Go 语言被称为“互联网时代的C语言”。Go 语言的风格类似于C语言。其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括号,循环也只有 for 一种表示方法,就可以实现数值、键值等各种遍历。

代码风格统一

Go 语言提供了一套格式化工具——go fmt。一些 Go 语言的开发环境或者编辑器在保存时,都会使用格式化工具进行修改代码的格式化,这样就保证了不同开发者提交的代码都是统一的格式。(吐槽下:再也不用担心那些看不懂的黑魔法了…)

开发效率高

imgGo语言实现了开发效率与执行效率的完美结合,让你像写Python代码(效率)一样编写C代码(性能)。

学习Go语言的前景

目前Go语言已经⼴泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。

Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态。Go语言的岗位需求持续高涨,目前的Go程序员数量少,待遇好。

抓住趋势,要学会做一个领跑者而不是跟随者。

国内Go语言的需求潜力巨大,目前无论是国内大厂还是新兴互联网公司基本上都会有Go语言的岗位需求。

下图是应用Go语言的公司举例:

image-20190203135218456

除了上面列出的大厂外,很多小型公司或创业公司也开始使用Go语言,并且很多公司把Go语言作为其主要开发语言。

现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.

参考链接

标签:Java,语言,性能,goroutine,学习,处理器,Go
From: https://www.cnblogs.com/nf01/p/17806885.html

相关文章

  • Django缓存机制
    一缓存介绍在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.缓存是将一些......
  • 《APUE》学习笔记
    学习资源:https://www.bilibili.com/video/av75586088/?p=2&spm_id_from=pageDriver&vd_source=1ecb7953e7a94890c19f9abe34af6240项目:IPV4流媒体广播系统知识点:多进程的实现及关系进程间通信多线程或多进程并发数据库文件I/O操作守护进程系统日志文件流量控制网络套接......
  • mongo备份篇 mongoexport、mongoimport 以及mongodump、mongorestore
    系列导航一、linux单机版mongo安装(带密码验证)二、mongo集群搭建三、java连接mongo数据库四、java对mongo数据库增删改查操作五、mongo备份篇mongoexport、mongoimport以及mongodump、mongorestore如下是总结mongo数据库在执行备份和恢复中一些常用的语句。备份方面比较:1......
  • 植物基因组学和作物改良中的深度学习
    目录深度学习:概念、工具和注意事项沿着分子生物学的中心法则进行深度学习DNA和基因特性蛋白质特性模型和数据共享理解基因组变异:从关联到因果关系和分子机制深度学习育种4.0:编辑育种结论植物基因组学取得了巨大进步,其特点是高通量技术的爆炸式增长,以低成本识别多维全基因组分子......
  • JUC并发编程学习笔记(四)8锁现象
    8锁现象八锁->就是关于锁的八个问题锁是什么,如何判断锁的是谁对象、class模板深刻理解锁锁的东西无外乎就两样:1、同步方法的调用者,2、Class模板。同一个锁中,只有当前线程资源释放后才会被下一个线程所接手。同步方法的调用者是两个不同的实例时,互不相关。静态同步方法(s......
  • 2023-2024-1 20231329《计算机程序与设计》第六周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06这个作业的目标计算机科学概论第7章并完成云班课测试《C语言程序设计》第5章并完成云班课测试......
  • <学习笔记> 点分树
    感觉可以理解为带修点分治。常用于解决与树原形态无关的带修改问题。——oi-wiki点分树是通过更改原树形态使树的层数变为稳定\(\logn\)的一种重构树。就是通过点分治找重心的方式,将这一层重心为上一层重心的儿子。所以对于很多暴力的复杂度是正确的。一开始发现建树错了......
  • 基于rk3588----i2c驱动框架学习(2)-总线驱动 algorithm 分析
    rk3588i2calgorithm分析来了来了,上次分析完i2c的驱动框架今天我们就看看i2c的algorithm是如何实现的staticconststructi2c_algorithmrk3x_i2c_algorithm={.master_xfer=rk3x_i2c_xfer,.master_xfer_atomic......
  • SpringSecurity的学习
    前置知识1.RBAC关系模型   这个图片很清晰了,一个用户可以对应多个角色一个角色可以对应多个权限,这样子我们就可以引出我们所设计的数据库用户,角色,权限共三张表,再通过两张表将他们连起来,这样子就可以进行权限控制,知道用户就可以得知该用户可以访问哪些模块,不能访问哪些模块......
  • 学习笔记8——20211303ltc
    学习笔记8一、作业要求自学教材第5章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......