这是我参与「第五届青训营 」笔记创作活动的第1天
前言
这并不是一篇教程,而是我对 Go 这门语言的一些思考。
第一次接触 Go ,是在写 MIT6.824 的时候。记得刚接触 Go 的我最大的感受,就是“这是个什么?”。类型后置,鸭子类型。。。毫无疑问, Go 在我心中是个异类。但随着了解的深入,我从它身上体验到了 C 的流畅, Python 的便利, 函数式编程的美。渐渐地,我相信 Go 能够担起各大互联网企业后端大梁,是有理由的。
类型后置
Go 官方对于为什么要将类型放在变量名后面早已给出了解释:Go's Declaration Syntax - Go 语言博客 (go-zh.org),通过那个著名的函数指针的例子,从可读性的角度解释了这样的做法。
类型前置:
int (*(*fp)(int (*)(int, int), int))(int, int)
类型后置:
f func(func(int,int) int, int) func(int, int) int
熟悉 C++,C#,Java 的程序员刚接触这种语法的时候大多会将其视为异类,但习惯了之后其实并没有什么不便。而有很大一部分初学者,因为这样一个小小的不同而放弃了学习一门语言,也是可以说明一些问题。
Why Go
刚接触 Go 的时候,我最好奇的是,这样的一门语言是怎么能够写服务端的?看看 Java,C#这些老牌服务端语言,复杂的权限、OOP、多线程,在我的心里写一个服务,就是需要一个很重的框架,就是需要实现一些接口,写一堆方法和逻辑。而 Go ,和他们比起来简直就是甜品。
深入接触了 Go 以后,我发现自己从语言的桎梏中解放了出来。原来服务并不需要那么多复杂的逻辑,监听一个端口,做一个路由,一切手到擒来。至于 Java 中谈之色变的并发问题, Go 却简简单单的实现了,速度还很快。
为什么 Go 的并发快
这是由于 Go 的并发是软件层面的,也就是协程,比起系统层面的线程代价要小得多。而 Go 的调度器采取的两种策略:
- 任务窃取(work-stealing)
- 减少阻塞
则是 Go 快的关键原因。 这也让我在编程时,更加追求所谓的无锁编程。
C++--
Go 常被称为“21世纪的C语言”。它确实很像 C 语言,有指针,但却带了个 GC 。但它也不是 C++ ,没有引入过多隐晦难懂的概念。(在我看来, C++ 目前的很多努力都像是为了填坑。)这是它作为一门新语言的优势,无需承担向前兼容的成本。但我觉得它的发布,或许还是“鲁莽”了一些。它本可以以更好的姿态展现在我们面前。
结语
Go 肯定不是最好的语言。但它能够让我写我所思,带我顺畅地去实现一些逻辑而不用考虑过多。从这个角度来说,它对现在的我来说就是最好的语言。