1.why Go?
接触一门语言,首先我们要对这门语言有着感性的认识,在没有了解该语言的语法细节下,我们要首先能对它的独特魅力有初步掌握,只有这样我们才能沿着正确的思维向导去感受这门语言的韵味~
为什么学习go语言,或者说go语言相对于其它的语言如C,Phython等有什么样的优势,什么场景下运用go语言可以最大程度发挥它的优势?目前我大致在网络上总结了如下几点特征:
(1)部署简单,go语言是生成的静态可执行文件,除了glibc之外没有其他的外部依赖项,这对于部署人员来说无疑是非常方便的事情,他不用去维护各种包,库的依赖关系,与phython在这一点的比较上具有巨大的优势。
(2)具有良好的并发性,go语言的goroutine和channel使得编写高并发的软件变得相当容易,单个go应用可以有效的利用多个核,很多情况下完全不需要考虑锁机制和由此引发的问题
(3)哲学艺术性的语言设计(这个实在很难体会,慢慢感受吧),从学术的角度讲 Go 语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go 的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是 Go 自带完善的工具链,大大提高了团队协作的一致性。比如 gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行 gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有 gofix, govet 等非常有用的工具。
- 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统,数据库代理器等
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、
- 内存数据库,前一段时间google开发的groupcache,couchbase的部分组建
- 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台
- Go的import包不支持版本,有时候升级容易导致项目不可运行,所以需要自己控制相应的版本信息
- Go的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,runtime调度的时候,需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了,突然冒出来又执行了,会导致逻辑出错等情况。
- GC延迟有点大,我开发的日志系统伤过一次,同时并发很大的情况下,处理很大的日志,GC没有那么快,内存回收不给力,后来经过profile程序改进之后得到了改善。
- pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱