为何要使用 Go 语言?Go 语言的优点在哪里?

golang主要特性

一、语法简单

  • 舍弃语法糖,严格控制关键字

C++语法糖之多,使人发指,而C又太过于底层,容易出现本身造轮子的状况,如何在二者之间取舍,是每个转向golang的工程师曾经思考过的问题。java

golang的出现,就是在C和C++之间的刚恰好的取舍。node

二、垃圾回收

  • golang支持垃圾回收,相比C/C++是一大进步。

c + +因为存在指针计算,即p++、p--等,没法提供垃圾回收功能,而golang虽然有指针,可是舍弃了指针的++、--等操做,因此提供了垃圾回收功能。react

  • 标记清除

三、错误处理

  • 报告普通错误+报告致命错误

C语言中错误处理并非语言规范的一部分,只是提供了errno这种系统相关的错误处理机制。而golang提供了语言层面上的错误处理的支持。程序员

golang中能够有两种错误处理方式:一种对C的错误处理的规范化:每次函数调用都检查返回值,另外一种相似C++和java中的try+catch+finally+throw。通常第一种用于报告普通的错误,第二种用于报告致命错误,如除0,访问数组越界。golang

  • error接口:实现error接口只需实现Error函数。golang支持多返回值,通常函数最后一个返回值是err error。docker

  • defer、panic和recover:异常处理机制,实现try+catch+finally+throw的功能,panic相似于throw关键字,即抛出异常,recover相似于catch,即捕获异常,defer相似于C中的atexit,java中的finally数据库

我的认为golang的这种错误处理方式比C、C++、java都更加优雅,固然,这样会形成写10行代码,可能有5行都在处理错误的状况发生。编程

四、面向对象

  • 在面向对象上,go语言表现得很是简洁和直接。json

  • 封装数组

封装这一块,能够细分为封装+隐藏:
①封装:将数据和基于数据的操做封装在一块儿,在C++中,经过隐藏的this指针传递对象的地址,在C中,要实现封装,要显式传递,在golang中,与C相似,显式传递,只不过换了个更加明显的位置。如:

type Integer int func (a Integer) Less(b Integer) bool{ return a < b } 

②隐藏:C++和java都使用访问控制符实现隐藏特性,即隐藏内部实现细节,只保留一部分对外接口与外部发生联系。C用static关键字实现隐藏,而golang中,首字母大小写表明了是否对外开放访问,仍是很机智的。

  • 继承

继承关系通常有两种:"is a"和"has a"
①"is a": 父:水果 子:苹果
②"has a": 父:羽毛 子:鸟
继承通常分为golang的设计哲学中反对继承,只提供最简单的组合,即"has a"关系。

  • 多态

golang的面向对象中最重要的就是接口,golang中的接口与其余语言的最大的区别就是它的非侵入性。

①非侵入性接口:只要实现了接口要求的全部方法,就实现了该接口,能够进行赋值。
②侵入性接口: 类须要明确的申明本身实现了某个接口。

非侵入性接口的好处:
实现一个类的时候不用再考虑我须要实现哪些接口,即接口由使用方按需定义,而不用事前规划。
好比在实现第三方库的时候,由调用方抽象出所需接口,便可屏蔽太多不须要关注的内容,也便于往后替换。

另外:

  • golang反对函数和运算符重载,由于这些特性解决了小部分OOP的问题,可是却为语言自己带来极大的负担。
  • golang不支持构造函数和析构函数,构造函数用NewFunc之类的函数代替。

总的来讲,golang对java这种激进的面向对象主义有限接收,时刻警戒语言特性复杂化。
虽然面向对象这块看起来太简洁,可是Cpp和java中能实现的面向对象的需求,golang中并不会出现不能表达的状况,这让人反思C++和java引入如此多复杂概念的必要性。

五、并发编程

  • 不要经过共享内存来通讯,而应该经过通讯来共享内存

golang是为并发而生的语言,goroutine+channel使得并发编程变得容易。

并发模型:

  • 多进程
  • 多线程
  • 事件驱动(reactor模型、epoll+回调、epoll+消息队列+线程池、异步非阻塞):libevent、 muduo、 node js
  • goroutine:相似于协程,用户空间本身实现调度,可是协程通常采用N:1线程模型,而golang采用更加复杂的M:N模型,因此golang通常单独称本身为go程。

而channel,能够理解为:用于并发单元间的数据解耦的、阻塞的、带类型的、并发安全的消息队列。channel可分为带缓冲的和不带缓冲的。

固然,golang依然提供了各类同步互斥机制,与C和C++不一样的是,golang对这些机制都作了封装:

  • 管道 ①匿名管道 ②命名管道,基于文件的,有原子性问题 ③基于内存的,有原子性操做保证的管道

  • 信号

  • socket

  • 互斥锁

  • 条件变量

  • 读写锁

  • 原子操做

六、代码规范

  • 每一个人写的代码都基本一致,不带我的色彩。

golang最符合我胃口的除了并发这一块,就是极其严格的代码规范要求了。做为有点儿代码洁癖的人,在遇到golang以前,每次看到别人的C/C++代码甚至是本身写的代码,都以为很乱,而接触golang以后,一下就被其干净、严格的代码规范吸引。

另外一方面,相信每个团队都会对代码规范作出要求,可是培训成本一般会很高,团队成员会不会严格遵照也很差说,因此反正都是要作的事,为什么不在语言层面就作了呢?

七、部署发布

  • 将运行时、依赖库直接打包到可执行文件内部,简化部署和发布

golang采用静态连接的方式编译,在部署的时候很方便,只须要配置文件和可执行文件。而C/C++得部署通常须要不少动态连接库,一个so的版本不对从而致使查bug查几天的事情时常发生,因此出现docker简化部署的问题。

用docker更好仍是用golang的静态连接更好,见仁见智,不过,docker也是golang写的,因此,这个特性golang胜利。

八、强大的官方package和工具链

官方package自己很是强大,基本解决了程序员开发过程当中的大部分需求,而一些特定的领域也能在开源社区中找到不错的组件,不像C系,一些很基本的库也要处处去找,各个版本区别也很大。

  • 网络:net、http、rpc、json
  • 安全:加解密
  • 容器
  • 数据库链接
  • io
  • 单元测试和性能测试
相关文章
相关标签/搜索