为啥要使用 Go 语言?Go 语言的优势在哪里?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥要使用 Go 语言?Go 语言的优势在哪里?相关的知识,希望对你有一定的参考价值。

1、简单易学。

Go语言的作者本身就很懂C语言,所以同样Go语言也会有C语言的基因,所以对于程序员来说,Go语言天生就会让人很熟悉,容易上手。

2、并发性好。

Go语言天生支持并发,可以充分利用多核,轻松地使用并发。 这是Go语言最大的特点。

描述

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。

在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。

参考技术A

为什么要使用Go语言:

从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样可以很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的奇点。

Go有什么优势:

    可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。

    静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。

    语言层面支持并发,这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的,大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢?Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发。

    内置runtime,支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。

    简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。

    丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大,我最爱的也是这部分。

    内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。

    跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。

    内嵌C支持,前面说了作者是C的作者,所以Go里面也可以直接包含c代码,利用现有的丰富的C库。

Go适合用来做什么:

    服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

    分布式系统,数据库代理器等。

    网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用。

    内存数据库,前一段时间google开发的groupcache,couchbase的部分组建。

    云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。



参考技术B 1、可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。
2、静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。
3、语言层面支持并发,这个就是Go语言最大的特色,可以充分的利用多核,很容易的使用并发。
4、内置runtime,支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。
5、简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大。
6、内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。
7、内嵌C语言支持,前面说了作者是C语言的作者,所以Go语言里面也可以直接包含C语言代码,利用现有的丰富的C语言库。

go语言的开发优势

最近用go语言重构了某后台系统,历时数月,对go从陌生到熟悉,渐渐喜爱上go开发,抽空分享下golang开发的一些优点。



便利的web服务访问

golang号称“互联网时代的c语言”,这个描述很贴切,有一句话说的很好:“在互联网时代,访问web服务和访问本地文件一样重要”,一个后台系统要相当频繁的和其他服务发生网络交互,而golang开发web服务简直易如反掌,寥寥几行就能实现一个强大的web服务。


到底有多简单,一行就够了

resp, err := http.Get("http://www.baidu.com")


调用一个Get函数就能完成发送请求、读取响应的整个流程,不需要写回调函数,不需要担心阻塞整个进程,完美!

除了golang,用OpenResty和Python也能实现这个效果。


当然会有人奇怪,golang是怎么做到的,按照正常流程,应该包括DNS解析、建立tcp连接、发送请求、监听socket可读可写事件、读取响应、断开连接等步骤,这是c/c++网络编程的基本套路。


出于好奇,本人简单的测试了一下golang的处理姿势:

  • 在同一个协程里连续请求10次baidu.com,golang会只创建一次连接,然后复用该连接

  • 在5个协程里请求baidu.com,golang会为每个协程创建一个连接,当5个协程退出时,会有2~3个连接不断开,后续再启动新协程请求时,复用剩余的2~3个连接

  • 进程退出时,断开所有连接


测试结果显示golang内部有一套自己的处理逻辑,一般不需要关心,有性能问题时再看也不迟。



协程routine

Lua语言也实现了协程,但golang和Lua的实现不一样。

  • Lua是单线程的,所有协程都在一个线程里运行,一个Lua服务只能使用一个cpu

  • golang支持多线程,协程可以分布到不同的线程里运行,一个golang服务可以使用所有cpu


所以在golang里协程基本等同于线程,开发时必须考虑多线程的竞争条件,通过channel、互斥锁、读写锁等手段实现多协程安全。 并发读没有任何问题,需要同时读写一个对象时要加锁保证安全。


协程是非常轻量级的线程,一个协程占用约4k内存,一个go进程同时开启百万个协程是没有任何问题的,单机支持百万用户并发完全可以做到。



静态类型检查

开发稍具规模的项目,若用动态语言开发就很吃力,由于缺失类型检查,有些错误需要上线运行才能发现,甚至运行一两年都发现不了,这是巨大的隐患。


golang类型检查非常严格,甚至int和float都不能互相转换,声明但没有使用的变量、import但没使用的package都会报错,这一点能节省不少检查时间。


由于是静态类型语言,可以实现联想提示,这一点能大大提升编码速度,喜欢吃番茄的c++程序员表示满意。


golang自带代码格式化工具,这一点也很赞,节省大量敲击空格键的时间。



panic异常信息丰富

这一点主要和C++开发相比,C++程序崩溃后几乎无迹可寻,花费几天定位错误位置是很常见的事,golang崩溃后会输出完整的堆栈信息,瞬间找到崩溃位置。


一个routine的崩溃不会影响整个服务,其他请求还能正常处理,这一点非常赞!



强大的性能分析工具

项目上线前通常做压力测试,如何能快速定位到性能瓶颈是非常关键的。


golang自带pprof工具,导入一个包 net/http/pprof 就能实现性能检测,可以分析cpu占用百分比、内存占用比例、协程数量。


可以将分析结果输出为pdf文件,其功能强大的令人震撼,非常直观!


总体来说,golang开发具有明显的优势,在运行性能、开发效率、问题排查都值得称赞,推荐学习!

以上是关于为啥要使用 Go 语言?Go 语言的优势在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Go 言 Go 语,一文看懂 Go 语言文件操作

Go 言 Go 语,一文看懂 Go 语言文件操作

你为何不使用Go语言呢?

Go语言与Java之间性能相差多少

go语言的开发优势

Go语言视频免费下载了!尚硅谷韩顺平老师再次发力!