我看go语言

原创
2017/10/26 18:59
阅读数 450

现在的编程语言有很多,但是能生存下来的,基本上都有一些自己的绝活,或者亮点。其实我真正熟悉的编程语言也并不多。java是我最为熟悉的,是我入门的编程语言。java足够简单,有丰富的特性,但是java也有自己的缺点,就是比较啰嗦,过于学院派。而且java虚拟机本身技术含量很高,难度也很大,很复杂。复杂意味着它的行为是难以预测的,这对编程来说不是好事,虽然90%的情况下我们不需要关注java虚拟机干了什么事情。

go是一门很有特色的语言。虽然我到目前为止基本没有怎么使用过go干过任何一件事情。但资料我却看了不少。我认为现在go语言已经完全成熟了,可以应用在工业领域了。go语言有非常多的优点,当然也有缺点,但是我觉得相比起来,其优点似乎更醒目一些。

go语言不是面向对象的语言,没有类,没有继承。虽然有接口以及类型。但是你也没有办法使用面向对象的那一套思维或者方法来设计程序。因此它也没有泛型,模板什么的。因为在我看来,泛型这样的技术,只有在抽象的系统中,才有更大的作用。而在容器(集合类)技术中,泛型的意义并不大,容器指定的所谓类型,其实是无关紧要的。早期的java并不支持泛型,其各种容器类比如list,hashmap也使用的很好。面向对象的语言需要泛型支持,是因为很多面向对象语言比如java,c++都是静态类型的,类型自然也是需要抽象的,所依类型的抽象很重要,于是就有了泛型。但是go语言并没有类这个层次的抽象,特别是,也没有继承的机制。当然,go语言的结构体和方法有很多种玩法,可以通过组合的方式来达到一些继承的特色,但完全不是继承。我不觉得把结构体搞得那么的复杂有多好。

go语言也不是函数式的语言。看起来大多数函数都有副作用,当然,你也可以写完全没有副作用的函数。同时go语言也支持闭包以及把函数作为参数传递。函数虽然在go语言中地位不低,但是没有惰性求值,柯里变换(Currying)。当然我对函数式编程这种技术理解的可能也不太全面,大多数的知识都来自于scala这门语言。我当然也不是什么学院派的,知识底蕴还是不足。我是工程派,在我看来知识和技能都是为了解决问题而存在的,能解决问题的知识与技能才是好的知识与技能。 看起来,go很实用,不追求那些学院派的做法。它并不打算给自己搞一个什么理论的支持。这一点其实很好,完全是工程师的视角,一切实用至上。

go语言是编译型静态类型指令式语言,支持类型推导。它编译速度比较快,同时支持解释方式运行。它工具链十分的健全,甚至连格式化工具都有。唯一缺憾是没有一个官方的包管理工具,不过第三方的包管理工具很多。此外golang采用了垃圾回收技术(GC),但是没有使用虚拟机来实现,而是将其打包在了编译结果中,这导致了golang编译出来的东西个头比较大。而且有GC停顿的问题。很多人都批判了这一点。关于golang的GC我也没怎么研究过,但是我觉得GC停顿对有些系统是致命的,但是对有些系统,特别是基于web的业务系统,其实影响并不大。

golang支持多核CPU,并发的时候既支持协程,也支持线程。我们都知道协程性能比线程好不少,因为golang同时支持协程与线程,又能够在一个进程上面利用多核CPU并发工作,所以golang的并发性能是很强的。此外golang的并发模型与elang的actor很相似,采用了channel的方式,在多个协程之间通讯,用这种技术来实现并发的控制。这种并发控制方式比共享内存加锁的方式要高效,而且也很容易理解。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
0
分享
返回顶部
顶部