要想快速高效率地掌握Go语言,关键是要经过不断写代码去训练,熟能生巧。方法是没问题的,但具体的路径呢?就像开车,能不能给个导航?我但愿这篇文章能起到一个导航的做用,这里提供的路径,应该对不少人都适合。固然每一个人的具体状况不一样,所以路径会有差别。你能够对这个路径进行剪裁,获得最适合本身的。golang
短期和高效率是这里的关键词。其实只要你天天用Go来编写程序,时间一长,也就掌握了,它不须要任何技巧,大智若愚,其实是一个不错的办法。但若是你想最快地掌握Go语言,仍是须要一些技巧的。sql
我之前也曾经学过一段Go,大概花了2周,基本的会了,但远远没有达到掌握的程度。后来由于有其余事情就放下了。如今回想起来,当时方法不对,效果也很差。后来用我如今要讲的方法,在不到2个月的时间彻底掌握了Go语言。这也得益于我之前对Java比较熟。数据库
什么叫彻底掌握Go语言?下面是个人标准:编程
其中#2又包括两点:架构
2.1. 熟悉经常使用的架构
2.2. 知道如何用Go语言来实现经常使用架构中的各个环节app
其中#2.1是跟语言无关的,须要长时间的编程积累,不是短期能完成的。#2.2是跟Go语言直接相关的,在了解语言的标准库的基础上还要熟悉经常使用的框架和第三方库。好消息是Go的标准库很是强大,你的主要精力要放在标准库,除此以外你只须要两三个外来库就好了。框架
这个方法只适用于已有其余语言编程经验的人,这样能够借助已有的其余语言经验,达到快速掌握Go的目的。其中2.1跟Go语言无关,主要是你之前的编程积累。你要作的是完成#1和#2.2。函数
高效率学习的关键是要进入一种正向反馈的自循环系统。在你掌握了基本Go语法以后,经过不断用Go写代码来加深对语言的了解和熟悉程度,以后就能够写更多、更深、更好的代码,这样就造成了正向反馈的自循环系统。像滚雪球同样,愈来愈大。微服务
快速的关键是用最短的时间进入这种自循环,也就是尽快了解Go基本语法。学习
学习分四个阶段。 完成以后,你应该已彻底掌握Go语言。
当你完成1-3以后,你已基本掌握Go语言。#4帮你完成对整个语言的完整掌握。
以上4条给你提供了一个大体的导航,这样你就知道了要去哪,中间路径怎么走,如今到哪了,还须要多长时间才能到达。
上面的时间只是个略估,每一个人的编程背景不一样,天天所花的学习时间不一样,最终完成时间和效果也会有很多差别。
这一阶段的目的是快速了解Go语言的基本语法(没必要深刻领悟细节),能本身编写简单程序(它包括安装Go),找到一个合用的IDE。最好的的教材是“Go by Example 中文”。你没必要完成全部的项目,只完成前面20个就好了。不少人推荐“Go 语言之旅” 这不是个好主意。 它对一些知识点抠的太细,不利于快速进入正向自循环。“Go by Example”讲得很浅,即便你学会了实际上也并无深刻掌握知识点( 那是第二阶段的任务),但第一阶段只要知道大概就好了。正由于这样“Go by Example”才是最好的选择。
第二阶段的任务是掌握Go的主要知识点,大概有二三十个。 例如arrays和slices的区别,函数调用时传参仍是传值(若是传值怎样改变参数的值?),指针的用法,Go中哪些类型是指针类型(Interface是指针类型吗?),Errors,Methods,package,go-sql,date 和time等等。这些看着简单,但实际上要真正掌握仍是要费一些时间的。
在这一阶段,你能够经过写一些小的程序来掌握知识点。好比写一个访问数据库的程序,有增删改查功能,数据库字段包括各类类型(时间类型会复杂一点)。而后在这个基础上增长域模型,把程序分层。
关键的一点是不要拷贝别人的程序,必定要本身用键盘把程序敲出来(能敲出一个字算一个,只有实在想不出来了再去看“Go by Example”)。只有这样才能真正学到。刚开始可能会比较痛苦,但只有痛苦了,你才能学到东西,并且这是最快的方法。(固然,当你掌握了Go语言以后再拷贝别人的程序就没有问题)
比较好的状态是你天天都有问题,不断地向本身提问(而后去解决问题),问题解决了,知识点就掌握了。提不出问题怎么办?不拷贝别人的程序是一个好办法,我发现当本身用手一个字一个字地敲程序时(而不是拷贝别人的程序时)会不自觉地思考不少问题并注意到了不少之前忽略了的地方。好比说,像上面“函数调用时传参仍是传值?”,你能不能本身写个程序测试一下,这样本身就能把问题回答了,而没必要到网上查资料去找现成的答案。测试时,若是类型是“string”或“int“很容易,若是是map, struct呢?测试以后可能还有问题,这样再去看文章就有针对性,效果会更好。这种状况下,学习过程是彻底有你来主导,是效率最高的。但须要你有比较好的编程基础。
若是你天天提的问题很少,还不足以主导整个学习过程,那你须要看书或看网上的文章来辅助。但须要注意,它只是起辅助做用,重点仍是要经过写代码来领悟。每次看书的时间不要太长,太长了容易被它的思路带着走,限制了本身思惟的活跃性。每次看文章只针对一个问题,充分聚焦。若是不是带着问题而只是泛泛地看书极可能当时看明白了,但次日就又糊涂了或忘了。只有本身想明白的道理才是你本身的,书上的都是别人的知识。这样天天大概掌握1-3个知识点,每天都能感受本身在进步,这就是最好的一种学习状态。
这时你已掌握了Go语言的基本知识点,是时侯写一个真正的能够在生产环境运行的程序了。
我建议你选一个熟悉的领域,好比一个简单的电商或学生注册课程的程序。大概有两三个域模型类(struct)和数据库表。程序能够分红三层,域模型层,业务逻辑层和持久层。先不须要有用户界面。各层之间要经过接口调用, 这样你可能还要经过容器(Application Container) 产生具体类型(Concrete Type)并用依赖注入(Dependency Injection)注入到函数中。这样就有必定的复杂度了。固然这里面牵扯到很多的设计问题。 若是你暂时不想考虑太多设计问题,那你只要把程序作出来就好了,也能达到掌握Go语言的目的,不过掌握的级别不同。 你也能写出熟练的Go程序,只是不知道如何设计而已。
若是你想把设计也包括进去, 那你要思考不少问题,例如程序的目录和包结构,设计架构和分层,编码规范,日志和错误处理,是否要支持事务。我在GitHub上完成了一个完整的程序,而且写了一些列的文章“清晰架构(Clean Architecture)的Go微服务”讲述上面的每一方面。 不过我不建议你一开始就看它。你须要本身先反复考虑这些问题,仔细设计。不须要一步到位,能够不断地对设计和程序进行重构。这中间你可能会碰到各类各样的问题,你须要在不断解决问题中成长。当你写到必定程度时,你能够去看上面提到的文章,跟你的设计和想法进行对比,印证。 若是有兴趣咱们还能够讨论,共同提升。
这时你已经基本掌握了Go, 再学习其余的库就会很容易,例如“Goroutines”,context”,“net/http”。我之因此把这些放在第四阶段是由于它们不影响核心功能又有必定难度,放在最后,学习坡度会比较平缓。
若是你只想掌握Go语言,对时间没有要求,那么内容的选择并不重要,任何学习内容和学习顺序都是有帮助的。若是你但愿在最短的时间内学会,那么内容的选择和学习的前后次序就比较重要了。下面是个人一些建议,固然你能够根据自身状况量体裁衣。
主要针对学习的第二阶段。不建议上来就直接使用第三方库。Go语言自己标准库很是强大,能作不少事情。使用第三方库反而会妨碍你对Go语言自己的理解。开始的时候仍是聚焦于语言自己。下面是部分可选知识点:
Module
strconv
string
time
go-sql
logging
。。。
主要针对学习的第三阶段。我不主张一开始就选择一个gRPC或Web的项目,由于它须要你额外了解gRPC或Web,这样会分散你的注意力,你须要同时学习Go和gRPC或Web, 会加大难度。固然若是你已经对他们很熟悉就另当别论。原则是你必定要选择一个阻力最小的方向,也就是你最熟悉的项目。对多数人来说,一个简单的访问数据库的程序应该是阻力最小的。完成这个以后,若是你愿意,能够在它的基础上加上gRPC或Web功能,若是你的架构合理,加上gRPC或Web会是一件很容易的事。
主要针对学习的第四阶段。有些人对Go“Goroutines”有误解,以为它很容易。若是只是简单地写一个“Goroutines”确实容易,但实用的“Goroutines”都须要“Goroutines”之间通讯和进行协调控制,要写出能在生产环境中可靠运行的“Goroutines”并不容易。有人专门作过调查,Go的“Goroutines”虽然比Java的“thread”要容易得多,但在程序中产生问题的几率一点也不比Java低。若是是团队项目的话,最好是在设计时就把“Goroutines”代码和其余代码分开,并由专人负责。下面是一些能够在第四阶段学习的库:
Goroutines (Channel)
net/http,
net/url
O/R mapping
reflect
决定那些文章要读,那些能够不读,这里主要针对Go官网上推荐的文章,在下载Go时就自带的。
须要读:
How to write Go code:
effective go:仍是有帮助的,但文章太长又枯燥,建议天天只读一段,花两周时间读完,这样不会太累。
不须要读:
go faq:
关于Go语言历史和特色:能够掌握Go以后再读
学习的过程同时也是遗忘的过程,只有成长的速度远远快于遗忘的速度才能一直进步。最好的方法是集中一段时间主要用来学习Go,假设每周花20小时,一个月基本小成,两个月就彻底掌握了。若是天天花2个小时(一周14个小时),我估计因为遗忘的做用,可能要两个月小成,四个月才能彻底掌握了。若是天天一个小时,我估计一年也学不会。写到这忽然有点泄气,发现这才是问题的关键,感受前面都有点白写了。结论是若是是业余想掌握Go确实须要比较大的毅力。
你可能要问,彻底掌握了以后若是一段时间不用,难道不会忘记吗?也会忘,但那时你对Go语言自己有了深入的理解,很短的时间就能捡起来。若是只是半生不熟的掌握,过了一段时间不用以后,就所剩很少了。