如题,为啥选用Go
语言?
本文将介绍该语言诞生的原因,核心特性以及应用场景等。
文章目录
- 前言
- Go诞生的原因
- Go的编码风格
- Go的核心特性
- Go的应用场景
前言
Go语言
为什么一会叫Go,一会又叫Golang?
这是因为Go的全名为Go language
,简称可以为Golang或者Go。而Go表示的意思有太多了,比如在英文里表示很多意思,很难让人们想到编程语言,所以一般在搜索时可以以Golang
作为关键字。但是在这篇文章里,两者等价的,所以有时可能称为Go,有时是Golang。
Go诞生的原因
Google在创造Go的原因:
- 计算机硬件的发展特别快速,性能提高的很快。目前主流的编程语言发展明显落后与硬件的发展,不能够合理地利用多核CPU以提升软件性能。
- 软件系统的复杂度越来越高,维护成本也越来越高。目前缺乏一个足够简洁高效的编程语言
- 企业运行维护很多C/C++项目,这两个语言虽然运行速度很快,但是编译速度很慢,同时还存在内存泄露的问题需要解决。这使得我们程序员再解决业务的同时,还要分出精力去处理业务之外的事情。
Go的编码风格
这里摘选一个GitHub仓库
最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。
传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,
同时编译花费的时间实在太长,对于编写-编译-运行这个链条来说周期太长。动态语言如Python,
由于没有强类型的约束,很多问题需要在运行时发现,这种低级错误更应该交给编译器来发现。
执行效率 execution speed:
C/C++ > Java > PHP 开发效率 developing efficiency: PHP > Java > C/C++
简单一句话,为了兼顾运行速度与开发效率。可以看成Go=C+python。
因为它本质上是个静态语言,不过编译器给了开发者许多“语法糖”,所以又兼备动态语言的特点。
Go的核心特性
-
并发编程:这个我觉得是最重要的特点,人家天然就支持并发。诶,有朋友可能会讲了,Java不也支持并发吗?Java是支持,它还有个关键字
synchronized
可以解决并发中的共享变量问题呢!但是人家底层还要涉及到内核层面的开销,所以一些锁特别“重”。而Go和它相比开销就小的多。不仅如此,还有个重要的点,人家是多线程。Go是多携程编程。什么是携程。携程可以理解为更加轻量的线程(gorountine),可以高效的处理并发,更加高效地利用多核。 一次可以在程序中启动成千上万个gorountine,从而高效地完成任务。
而gorountine之间的通信采用独特的chanel机制,确保gorountine之间可以通信。
-
内存回收(gc):这个大家就比较熟悉了,学过Java的朋友不陌生。我们在开发程序时无须去考虑内存问题,因为有jvm会帮我们自动释放内存。而Go也同理,它会帮我们自动回收。
GC过程:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时启动一个专门的goroutine,回收内存到空闲list中以备复用,不物理释放,物理释放由专门线程定期来执行。GC瓶颈在于每次都要扫描所有对象来判活。待收集的对象数目越多,速度越慢。GC性能可能会随着版本不断更新会不断优化。只需要new分配内存,不需要释放。
这里插播一下,关于Go的内存分配。
在初始化阶段直接分配一块大内存区域,大内存被切分成各个大小等级的块,放入不同的空闲list中。对象分配空间时从空闲list中取出大小合适的内存块。内存回收时,会把不用的内存重放回空闲list。空闲内存会按照一定策略合并,以减少碎片。
-
网络编程:这里说白了就是像其它语言一样,也提供了丰富便捷的网络编程接口。Go语言还自带了高性能的HttpServer,通过简单的几行代码调用,就可以得到一个基于协程的高性能Web服务,维护成本极低,没有任何依赖。
socket用net.Dial(基于tcp/udp,封装了传统的connect、listen、accept等接口);
http用http.Get/Post();
rpc用client.Call(‘class_name.method_name’, args, &reply); -
函数多返回值:不仅返回本来的值,还可以返回一个error对象,用来出现异常时使用。这也是Go推荐的编程风格。有时候会有这种需求。
-
语言交互性:可以调用其它语言编译之后的库,比如C。
-
异常处理:Go语言不支持try catch这样的结构化的异常解决方式。Go语言提供的异常处理方式是:如果是普通异常,查看被调用方返回的error对象;如果是严重异常,指的是中断性panic(比如除0),使用defer…recover…panic机制来捕获处理。严重异常一般由Go语言内部自动抛出,不需要用户主动抛出,避免传统try…catch写得到处都是的情况。
三个重要关键字defer、panic、recover;
defer是函数结束后执行,呈先进后出;
panic是程序出现无法修复的错误时使用,但会让defer执行完;
recover会修复错误,不至于程序终止。当不确定函数不会出错时使用defer+recover。 -
除此之外还有一些其它的特性了,比如上文也出现的defer机制,本质上是延迟执行。个人觉得有点像Java中的finally和守护线程。还有一些类型推导等特性,各位在具体学习中会感受到,这里不多介绍了。
Go的应用场景
主流的应用场景有那么几个:
- 区块链开发:这个怎么讲呢。区块链本质上是一个分布式账本技术,就是人人都可以参与记录。而编码实现所用到的技术栈就是Golang。目前来看,也算是未来的一个趋势吧。
- 游戏/web端开发:先说游戏这块。举个例子,平时咱们打lol时,队友上去打出了爆炸伤害,我们可以马上看到。这里就可以看成数据的实时同步了,有个专业的词,叫数据通道。而Golang可以实现这个数据通道。而web开发,这个就不用多说了吧,人家也可以做web应用,甚至于当下主流的微服务应用也能驾驭。
- 云计算/云服务后台应用:这里主要涉及到一些云上的东西,如京东的消息推送和分布式文件系统,都是采用Golang来实现的。还有盛大的CDN(内容分发网络)等等。因为Golang的计算机能力比较强。
不仅如此,Golang还被用来开发一些中间件。比如大名鼎鼎的docker
、k8s
等。人家就是用Golang来做的。还有微服务注册中心consul
等等。
之前在网上看到一个总结,未来的软件系统应用可能是C/C++负责底层实现,Java负责高层(即业务层)的编码实现,而Go可以来负责中间层的实现。目前来看的确有这种趋势。
但是和其它语言相比,个人还是觉得Go的特性虽然足够诱人,但是国内的社区活跃度还是不够,这里也希望各位学习该语言的小伙伴可以一块记录下博客或贡献开源代码,一起为这个社区贡献出一份力。
文中有些内容摘选自互联网。最后,感谢您的观看