大话go语言谈谈go语言的类型系统

白癜风如今最好的手术方法 http://pf.39.net/bdfyy/bdfyc/150916/4697480.html

引言:最近地铁上没事,准备花一点时间研究下go语言,分两节来分享,这节首选『类型系统』因为我觉得类型系统是一门语言之核心。

五年前,曾被面试官面试到C和C++的区别。其中有被问到如何用C语言实现面向对象编程。

带领大家复习下,首先C语言是一门面向过程编程语言,要想实现面向对象编程,那需要知道面向对象的核心:封装、继承和多态。C语言的struct天生有封装特点,只是作用域都是public,这个可以通过编程约定来解决;继承是个考察点,记得linux驱动程序中kobject模型,就是通过成员变量包含另一个类型变量来实现继承,专业术语叫做组合;剩下的多态可以通过函数指针来实现。没想到后来写了四年的java。

之所以有此回忆,是因为最近接触到了互联网的C语言:go。今天主要谈谈go语言类型系统,对其天生的并发、类协程留待下一节聊。

go语言的诞生体现了编程大佬们不甘寂寞、追求极简又极度天才的行为。为什么说呢,如果不了解的人可以查下,go语言的创始人和支持者都是些什么人:JavaHotSpot虚拟机开发者、Unix团队成员、C语言、unix、plan9创始人之一、UTF8规范制定者。我曾经试想过早期的技术大牛到老了他们在干什么呢?他们还是不甘寂寞的!!

言归正传,对于有C语言基础和java基础的人来说go语言理解起来是非常简单的,因为她努力地使自己变简单。从类型系统角度我罗列下。

静态类型。写python的人会得意于开发的速度,但是很少有人愿意读别人的python代码,读python源码如果没有注释也很痛苦,这就是动态语言的弊端,java就好多了,一个方法从参数名和类型上基本可以读懂方法的行为。go语言就择优而选,并且索性做彻底,对于没有用到的变量直接编译错误,对于导入的没用的包也直接提示错误变量在前,类型在后。这也是很多人不习惯的,但go并不是第一个。这样也有个好处,方便编译器处理,对于C语言指针的弊端也有了统一的处理。go语言统一:varp*int从左到右p是一个*(指针),指针指向int型既有指针也有gc。gc不用说了,java的gc已经名满天下,没人愿意亲自管理自己的内存分配,指针使得go语言更接近底层。有时候我觉得,可能java是引用传递所以不需要指针,而go是值传递所以需要指针吧。封装。既然支持面向对象,那封装必不可少。跟C语言很像,struct,不过go语言支持包级别可见性。通过首字母大小写来区分是public还是private,这确实少了很多字,这也是极简的一部分吧。组合(嵌入类型)替代继承。go语言使用了上面我面试中提到的组合取代继承,go语言中叫嵌入类型。通过将一个类型在另一个类型中嵌入声明来拥有该类型的成员和接口方法,看来大佬们对于面向对象中的继承的弊端进行了彻底的解决,历来继承作为面向对象中封闭开放原则的折衷,为程序员诟病,go语言直接通过弃掉方式进行了处理,也是蛮任性的多态。为了支持多态,go语言借鉴了java的interface但是采取了鸭子模式:你跑起来像鸭子,叫起来像鸭子,那你就是鸭子。go的接口不需要显示实现,而是通过对一个接口函数传入『接收者』这样一个特殊的参数来对该接收者类型定义某个接口的方法。有接收者的函数成为方法。通过以上特点,结合go语言简洁的语法,可以看出来go几乎可以认为是C语言、python、java的集大成者,有空总结下go的天生神器goroutine和通道,那才是go被成为互联网时代的c语言的原因。

目前以我个人拙见,go语言更适合业务层以下,底层和驱动层以上的服务层,主要原因还是go太年轻,目前没有像java的spring这种稳健成熟的组件支撑,也没有对c语言的驱动设计产生任何影响,不过单独对服务api和容器的贡献,已经让go语言成为璀璨的巨星了。这也正应了程序界的那个真理:脱离场景谈语言是没有意义的,没有最好的语言,只有最合适的语言。

欢迎


转载请注明:http://www.aierlanlan.com/cyrz/2193.html