内容简介:2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。被称为GO语言之父的
2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的 GO 语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。
被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Rob Pike以一种非常朴素的方式,概括了GO语言的整个设计哲学--将简单、实用体现得淋漓尽致。
很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。
发展历史
2007年9月,Rob Pike在Google分布式编译平台上进行C++编译,在漫长的等待过程中,他和Robert Griesemer探讨了程序设计语言的一些关键性问题,他们认为,简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步。随后他们在编译结束之前说服了身边的Ken Thompson,觉得有必要为此做一些事情。几天后,他们发起了一个叫Golang的项目,将它作为自由时间的实验项目。
2008年5月 Google发现了GO语言的巨大潜力,得到了Google的全力支持,这些人开始全职投入GO语言的设计和开发。
2009年11月 GO语言第一个版本发布。2012年3月 第一个正式版本Go1.0发布。
2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除 C语言 部分,使用GO编译GO,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。
在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,而在稳定性、编译速度、执行效率以及GC性能等方面进行了持续不断的优化。
GO语言关键特性
GO语言之所以厉害,是因为它在服务端的开发中,总能抓住 程序员 的痛点,以最直接、简单、高效、稳定的方式来解决问题。这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,跟随大师们的脚步,体验GO的设计哲学。
GO语言的关键特性主要包括以下几方面:
- 并发与协程
- 基于消息传递的通信方式
- 丰富实用的内置数据类型
- 函数多返回值
- defer机制
- 反射(reflect)
- 高性能HTTP Server
- 工程管理
- 编程规范
开发过程中需要注意的点
以下是在实际开发过程中遇到的一些问题,仅供参考:
异常处理统一使用error,不要使用panic/recover来模拟throw…catch,最初我是这么做的,后来发现这完全是自以为是的做法。
原生的error过于简单,而在实际的API开发过程中,不同的异常情况需要附带不同的返回码,基于此,有必要对error再进行一层封装。
任何协程逻辑执行体,逻辑最开始处必须要有defer recover()异常恢复处理,否则goroutine内出现的panic,将导致整个进程宕掉,需要避免部分逻辑BUG造成全局影响。
在Golang中,变量(chan类型除外)的操作是非线程安全的,也包括像int这样的基本类型,因此并发操作全局变量时一定要考虑加锁,特别是对map的并发操作。
所有对map键值的获取,都应该判断存在性,最好是对同类操作进行统一封装,避免出现不必要的运行时异常。
定义slice数据类型时,尽量预设长度,避免内部出现不必要的数据重组。
第一步 Go 语言之旅
这个是一个官方的入门教程,或者说只是一个大概了解的教程,只介绍了一些简单的东西,并且没有太多的说明。不过这个教程支持在线执行代码,还是很不错的,这个时候你都不需要有本地的开发环境。不用想太多,现在就开始,把这个教程从头到尾看一遍,练习一遍,遇到不明白的地方也不要纠结,继续向后看就行了。
中文网: http://tour.studygolang.com
第二步 开发环境
这里也可以忽略不看,因为每一个教程都会介绍怎么配置环境
操作系统
个人推荐使用 Linux,可以使用 Ubuntu 或者 Fedora ,如果条件允许(不差钱) 也可以使用 Mac,当然使用 Windows 也是可以的,慢慢的就会知道 Windows 下做开发的纠结了。
开发环境
Go 的安装非常的简单,没有太多的依赖,如果是 Linux 下安装基本上下载一个二进制包,解压配置上一个环境变量、GOROOT 既可以了,具体的可以查看官方的安装方法: 官网安装文档 、 中文安装文档
开发工具
可以选择一个自己喜欢的,个人建议要用个 IDE,我使用过 vim 、Sublime、Intellji idea ,最后发现还是 IDE 比较方便,尤其是代码追踪断点等。这个不纠结那种好,有人和我说 Sublime 和 vim 安装上插件也都可以,但是个人不推荐(我以前是 Sublime 重度用户,PHP 一直都在 Sublime 下开发)。
主流的文本编辑器及 IDE 的配置 官方 都有介绍,选一个自己喜欢的就可以了。
第三步 看一套视频
有人可能喜欢看视频,有人可能喜欢看文档,这个根据个人爱好去选择,个人建议要看一套视频并且只看一套就够了,毕竟看视频的效率还是比较低的,看完视频一些基础的知识点就可以掌握,并且会知道一些专有名字的读法。我以前学 PHP 的时候就从来没看过视频,导致很多名词的发音都是错的,经常被人嘲笑……,当然如果英文非常的好的同学就不用纠结了。
网上 Golang 的视频不是很多,不过也有好多套,推荐 无闻的Go编程基础,这个是被 golangcaff.com 的 Summer
整理优化过的,看起来的效果会比一些其他网站好一些。
第四步 看一篇教程
教程也有很多,看个人的喜好吧,推荐看 Go 入门指南 ,这个也是由 无闻 翻译 的 The Way to Go ,不过社区的版本对排版进行了优化并加入了后面没有翻译完的部分。
第五步 将标准库全部都过一遍
至少要叫常用的全都看一遍,如 strings / strconv / http 等,如果有能力可以将它们都记住,如果记忆力不太好(像我这样)至少也要知道有什么,用到的时候通过手册可以快速找到。
官方标准库: https://golang.org/pkg/
中文版的标准库: https://studygolang.com/static/pkgdoc/main.html
极力推荐 https://github.com/astaxie/gopkg ,可以在学习的时候看这个,有关于标准库的详细说明和示例,学习起来会容易一些,等全都明白了要使用的时候可以去查看上面的文档。
更新:
又发现了一个不错的学习标准库的资料: 《Go语言标准库》The Golang Standard Library by Example ,有点小遗憾就是不是很全,个别的包没有完成,不过 astaxie 的那个也不全,可以互相参考着看。
完成
到这个时候,你肯定已经入门了,剩下就开始写自己的东西吧,比如写一个博客,或者去学习一个框架,不知道怎么继续去深造的话就去招聘网站上看看自己喜欢的企业都要求什么,招聘要求会什么就去学什么。
暂时就到这里,后续还会继续更新此文档,推荐一些有用的资源,欢迎收藏关注。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 亲测GO环境搭建,理解go build、go install、go get
- Go,Go,Go 明天上班记得定闹钟
- 继续Go!Go!Go!Sofacy组织已使用Go语言开发出新的Zebrocy变种
- 深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发
- [译] Go 语言回顾:从 Go 1.0 到 Go 1.13
- Go关键字--go
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。