Go语言学习 初篇

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

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

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

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

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语言这个伟大项目。git

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

Go语言在现成的语言中吸收了不少理念:golang

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

虽然Go语言集多种语言特性而成,但并不是臃肿难用。相反,Go语言具备很是轻便、上手容易、开发便捷、编译快速等特色。编程

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

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语言入手,可为了深刻技术,不能深刻并发编程领域,深感遗憾。习惯了ES六、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翻译

相关文章
相关标签/搜索