C++语法糖之多,使人发指,而C又太过于底层,容易出现本身造轮子的状况,如何在二者之间取舍,是每个转向golang的工程师曾经思考过的问题。java
golang的出现,就是在C和C++之间的刚恰好的取舍。node
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对java这种激进的面向对象主义有限接收,时刻警戒语言特性复杂化。
虽然面向对象这块看起来太简洁,可是Cpp和java中能实现的面向对象的需求,golang中并不会出现不能表达的状况,这让人反思C++和java引入如此多复杂概念的必要性。
golang是为并发而生的语言,goroutine+channel使得并发编程变得容易。
并发模型:
而channel,能够理解为:用于并发单元间的数据解耦的、阻塞的、带类型的、并发安全的消息队列。channel可分为带缓冲的和不带缓冲的。
固然,golang依然提供了各类同步互斥机制,与C和C++不一样的是,golang对这些机制都作了封装:
管道 ①匿名管道 ②命名管道,基于文件的,有原子性问题 ③基于内存的,有原子性操做保证的管道
信号
socket
互斥锁
条件变量
读写锁
原子操做
golang最符合我胃口的除了并发这一块,就是极其严格的代码规范要求了。做为有点儿代码洁癖的人,在遇到golang以前,每次看到别人的C/C++代码甚至是本身写的代码,都以为很乱,而接触golang以后,一下就被其干净、严格的代码规范吸引。
另外一方面,相信每个团队都会对代码规范作出要求,可是培训成本一般会很高,团队成员会不会严格遵照也很差说,因此反正都是要作的事,为什么不在语言层面就作了呢?
golang采用静态连接的方式编译,在部署的时候很方便,只须要配置文件和可执行文件。而C/C++得部署通常须要不少动态连接库,一个so的版本不对从而致使查bug查几天的事情时常发生,因此出现docker简化部署的问题。
用docker更好仍是用golang的静态连接更好,见仁见智,不过,docker也是golang写的,因此,这个特性golang胜利。
官方package自己很是强大,基本解决了程序员开发过程当中的大部分需求,而一些特定的领域也能在开源社区中找到不错的组件,不像C系,一些很基本的库也要处处去找,各个版本区别也很大。