最近闲来无事,学习了下go语言。 先后看了《The Way to Go》和《Go in Action》, 前者让我对Go语言有了基本的了解, 而后者作者的文风让我深深陷入了Go的学习之中。所以计划将来一段时间深入学习和使用下Go这个伟大的语言。

我是一个菜鸟,对C系编程语言有过接触,但都是半途而废, 只因自己基础不够,无法深入到C系语言的精髓之处。 学习go也是想弥补自己编程体系中缺失的一部分, 曾经想用C弥补,感觉不是我所能深入的。 而接触到go,感觉到了希望。

个人对编辑器和各种复杂操作界面的工具都不敏感, 不太会使用它们。 而我自己学习理解语言的习惯又是喜欢群追到底, 特别是每个细节我宁可深入到internal也要搞懂。 曾经我也搞vim去读过nginx, php源代码, 但过程是相当艰辛,读的那段时间还能略懂一二,长时间不复习,就不知所云了。 vim相比当前流行的集成编辑器还是有些鸡肋,但我钟爱, 没有办法。 Go语言就非常适合我这种菜鸟, 至少我希望了解internal的时候,所有的源代码我都可以从本机读到,所有的文档我也可以从本机命令中获取。 所以本文所有观点仅限于个人喜好, 不存在黑某些语言,推崇Go语言的问题。

此文为本人学习Go语言和记录学习过程的开篇之作。 因此首先引用一些事实和大神的话,为文章撑撑场面。

Go语言的创立

Go语言是2007年由Rob Pike, Robert Griesmier, Ken Thompson三个人启动的一项试验,结合他们十多年的工作经验,立志在现有语言启发基础上,创建的一种新的系统语言。本身这些人都是Unix领域的大神,以前都负责过Unix, Plan 9, B, Java的JVM Hotspot, V8, Strongtalk, Sawzall, Ed, Acme以及UTF8项目,都是鼎鼎有名的巨匠。 他们2007年以一种非常纯的心态走到一起,启动了Go语言这个伟大项目。

众所周知,计算机领域发展迅速,特别是硬件发展非常快。 早些年,我们使用的计算机存储只有几兆,网速也只有几K,CPU也只是单核。 而现在再看看,手上拿的手机,随便一个都可以达到4核、8核,内存也远比原来的PC机要大上数个量级。 可见计算机硬件发展之迅猛。 然而纵观编程语言的发展,C语言从其出道一直到现在都是缓步发展,虽然出现了C++之类的高级语言,但本质上还是基于早些年的计算机架构实现的语言系统, 面对当今的计算机硬件来说,感觉力不从心,完全没有能力充分利用现代计算机的所有资源。因此也是鉴于这个出发点,三位大神启动了Go语言的研发。

Go语言在现成的语言中吸取了很多理念:

  • Go语言的基本语法、简单结构取自C系语言。
  • Go语言的接口继承来自Java系语言。
  • Go语言包的定义取自Java、C#之类的语言。
  • Go语言的多态与继承无关的特性来自于Javascript、Ruby等其他动态语言。
  • Go语言的通信序列过程采用来自Limbo语言。

虽然Go语言集多种语言特性而成,但并非臃肿难用。相反,Go语言具有非常轻便、上手容易、开发便捷、编译快速等特点。

在Google团队中,大量的C项目,编译速度之慢让人难以忍受。 而Java, .net来说,执行效率又相对不高。 对于动态语言来说,开发效率高,但执行速度就非常一般了。 Go语言可以做到编译快速、执行高效、开发便捷。 这其实有赖于三个创始人最初的理念: 在安全、高效和开发难度之间综合评估得到的完美平衡。

Go语言设计原则

Go语言设计的时候遵循了很多原则:

  • 用最少的关键词: Go语言只有25个关键词。 这样可以简化编码过程的混乱和复杂度。 代码干净、整洁和简洁。 编译速度也可以很快, 因为编译过程中关键词少到完全不用符号表来协助解析。
  • Go语言为解决某个问题仅提供一到两个方法, 让代码开发易读、易理解。毕竟代码是写给人看的,不是写给机器看的。

总结一句话就是: 简单、简洁、简化、整齐、干净、标准。

Go语言的受众

对于有一定其他语言的编程经验,很容易转到Go语言领域。对于C语言、Java语言、PHP、Python、Ruby、Javascript等编程开发者都很容易加入到Go的行列。

Go语言特性

  • Go语言天生是解决并发编程的。
  • Go语言没有类和继承的概念, 它通过接口实现多态。它是一种清晰易懂、轻量级类型系统,类型之间没有层次之说。可以说是一种混合型的语言。
  • Go语言的基础构件是函数, 使用非常灵活。可以充分利用函数式编程的理念。
  • Go语言使用静态类型,因此是类型安全的语言。
  • Go语言构建本地代码,程序执行速度非常快。
  • Go语言是强类型语言,隐式类型转换是不允许的。一条原则: 所有都是显示的。
  • Go语言还有一些其他动态语言的特性(var声明变量), 这对于恐惧Java、.Net类型语言的开发者来说是极大福音。
  • Go语言支持交叉编译。 而且是一门完全支持UTF-8的编程语言, 不仅体现在处理字符串,还包括源代码文件都是UTF-8的,做到真正的国际化。
  • Go语言通过包来管理小的功能模块。可以通过go get获取外部包。

Go语言缺失的特性

  • 为了简化设计, 不支持函数重载荷操作符重载。
  • 为了避免在C/C++开发中出现的一些Bug和混乱,不支持隐式转换。
  • Go语言通过另外的方式实现面向对象设计,放弃了类和继承。
  • Go语言可以通过接口实现类似变体类型的功能,但本身不支持变体类型。
  • Go语言不支持动态加载代码。
  • Go语言不支持动态链接库。
  • Go语言不支持范型。
  • Go语言通过recover和panic来替代异常机制。
  • Go语言不支持断言。
  • Go语言不支持静态变量。

Go语言解决的痛点

有过大型Java项目或C项目开发经验的人来说,感觉遇到解决并发问题时,代码难度之高,潜在bug之多不足为怪。我也曾接触过Java和C,也曾踌躇满志想深入两者或其中之一,但是最终都被里边复杂的编程拒之门外。

我挑选了简单的PHP, Python, Javascript语言入手,可为了深入技术,不能深入并发编程领域,深感遗憾。习惯了ES6、Python的开发,再想深入到繁杂的Java、C开发,真是力有余而心不足。

自从接触到Go语言,我激动了, 我看到了希望。

  • Go语言开发效率可以和我惯用的Python、PHP、Javascript达到一致。特别是一贯以VIM作为编辑器和编译器的我,感觉到前所未有的激动。 因为我可以仅仅用我最熟悉的编辑器来实现编译型高级语言的书写。
  • Go语言自带并发解决,它提供的goroutine, 完全可以让我抛弃掉那些高端的多线程、多进程编程概念。而且得益于defer、go关键词,我完全可以将复杂的功能以顺序执行的流程来完成,需要的时候添加go来实现goroutine, defer来执行完释放不需要的资源。
  • Go语言自带垃圾处理。 这点让我可以避开枯燥难懂的垃圾处理,可以像写PHP一样,毫无顾忌的书写代码,而不担心内存泄漏。
  • Go语言的类型系统简单到可以尖叫。 因为它的类型系统实在太简单了,我完全不需要为了实现某些功能而事先花费大量的心力来了解类似C语言、Java语言之类的类型系统。 因为Go语言中的类型就是现实世界的完全简化:整数、布尔值、字符串、数组、分片、映射、接口、结构体和函数。
  • Go语言没有继承和类,而它提供了组合的概念,我们可以实现多态。 因为它有接口,完全可以类似的动态类型。

Go语言工具集

编辑器

工欲善其事,必先利其器。 学习和开发任何语言都离不开自己得心应手的编辑器。对于编程语言所需的编辑器需要有下面的特点:

  • 语法高亮: 这点当然很重要,很多工具都提供了配置和设置文件来满足这个目的,更好的是可以选择或定制不同的颜色方案。
  • 代码自动保存: 这点个人觉得可有可无,当然担心突然断电或开发过程中突发异常,辛苦的代码丢失是非常让人恼火的, 有这方面担心的还是保留这个需求吧。
  • 行号显示: 代码开发时,显示行号非常重要,可以方便我们在代码内容中查看作为参考。
  • 良好的代码结构审阅和导航: 毕竟项目都是由大量目录和文件组成的,有一个良好的导航会让我们的工作效率更高。
  • 便捷的查找和替换功能: 在实际开发中,我们经常需要搜索特定关键词,例如查找某个功能的定义出处和含义,另外我们还可能在开发过程中需要对某些变量名进行替换,那么需要替换掉项目中所有使用到该变量引用的地方。 方便的查找和替换功能不可缺少。
  • 快捷的注释/取消注释掉选择的代码区块: 开发过程中,由于调试或测试的原因,很有可能需要注释或取消注释一段代码区域,如果能很便捷的实现这些操作,有助于事半功倍。
  • 编译错误提示: 编译错误最好能高亮并指出代码所在文件和行的信息。
  • 跨平台: 项目开发和项目部署大部分时间来说都是不同的,如果编辑器能支持跨平台编译再好不过了。
  • 最好免费: 毕竟挣钱不易,当然遇到超级棒的收费工具,能帮我们带来更多利益和便捷,我们也可以支付一定费用给软件方,毕竟他们做这些工具也很辛苦,给我们提供了便利,我们也应适当的支持下对方的工作嘛。
  • 最好是开源的: 因为当你非常熟悉你的IDE的时候,你希望编辑器能提供更多你自定义的特性,而这些特性提供方不可能为你那么个性的需求做定制的,那么你就自己来定制吧。
  • 插件架构: 编辑器采用插件架构,可以方便扩展,也可以使用新的插件来替换某个功能。
  • 便于使用: 这点最关键,编辑器毕竟是工具,为的是提高你的生产效率。 好用是关键, 其他的都是浮云。 如果你用记事本能搞定一切,就不要用吃内存很多,占用CPU更厉害的其他集成编辑器了。
  • 代码模版: 这个功能的支持,我个人觉得在学习阶段不是必须,但是在实际开发过程中,为了提高开发效率,有代码模版也是不错的选择。 在一定程度上还是能大大提高开发效率的。
  • 调试功能: 断点、监测值、逐步执行代码、跳过标准库代码等调试相关的功能。
  • 智能代码补全
  • 最近项目和代码记录
  • 内置go工具: 例如go fat, go fix, go install, go test等等。
  • 和版本控制集成: 比如集成git,svn等。

下面简单列举下Go语言编辑利器。

其他工具

以上只是本人的一些初步理解和认识,还有很多激动人心的特点,值得我们深入了解。

本文仅用于个人学习,里边见解仅个人理解,如有不对,敬请不吝赐教(本人是菜鸟一个)

我的文章

Go In Action翻译


老将廉颇
878 声望297 粉丝