Go 语言学习历程

接触Go是2012年的时候,真正开始系统的学习和开发系统是2014年了,Go语言的学习也算自己2014年的重要工作之一,对Go语言学习的总结,也算是年底总结之一

1.学习Go的原因和动机:

1>先前做过2年Unixc开发经验,对于C系的语言有特殊的感情,Go特别适合我胃口,用过后爱不释手;

2>Go语言团队太过耀眼和强大:Thompson图灵奖获得者,unix和C的共同发明人;PikePLAN9操作系统的主要开发者、UTF-8发明者;RobertGriesemer参与java的HotSpot,jsv8引擎开发者;

3>国内传道者的极力推荐:许式伟兄,谢孟军兄等强力推荐及相关书籍问世;


2.学习资料:

书籍是:老许的《Go语言编程》、老谢的《Goweb编程》、雨痕的《Go语言学习笔记》、Golang.org上面的《EffectiveGo》、《TheGoProgrammingLanguageSpecification》、Go标准库和github上众多开源库当然无闻的视频教程也是非常适合初学者的,跟着他一起把代码敲一遍事半功倍

3.Go学习体会:

Go语言基础知识非常简单,简单到几天就可以学完,并能够上手开发;但是要做到精通,没有一定的代码量和几年的经验很难达到,这是学习任何一门编程语言都必须要经历的,你唯一能做的是:不停的写代码,不停的思考,不停的总结,不停的读别人代码,向高手请教;

4.Go学习难点,将我在学习中遇到的难点,以及相关参考资料索引出来,这些知识点对新入门的学习者有点难,但是对于想全面掌握Go技能的开发人员来说,我认
为是非常有价值的,这些知识点都是个人一步步学习趟过坑之后去发掘的:

Gomapslicestringarrayinterface底层数据模型,其中array和slice是引起混乱的根源;参见:RussCox非常经典文章

GoDataStructures
Arrays,slices(andstrings):Themechanicsof'append'

Godeferpanicrecover是Go特有的,Go的错误就是错误,异常就是异常,没有混为一谈,这个设计表面上看代码烦乱了,实际上更清晰;trycatch表面上是清晰,实际上隐藏着太多的问题。(两种错误处理机制:异常抛出机制-错误码处理机制)

使用Defer的几个场景

Gointerface接口的底层实现机制(能深入到源码)(深入才能理解:接口赋值,接口转换,接口断言及Go的动态性);Go就是一门面向接口、面向组合编程的语言,对于Go语言来说接口是灵魂一点都不为过;

参见:老许《Go语言编程》第9章9.5节接口机理
参加:国外一位大佬写的:HowtouseinterfacesinGo
参见:interfaces_and_types
参见:LearningGo-Interfaces&Reflections

Go类型系统:这个对掌握一个语言非常重要:statictype(语言层面就是静态类型语言),dynamictype(动态类型针对接口而言),underlytype(底层类型针对强制转换和赋值);Go的类型系统比较简练,干净,都是值类型,即使像slice,map,channel,func等看起来是引用类型,其实也是值类型,只是其内部数据结构封装了指针罢了;不像JAVA有两套类型:基本的是值类型,对象是引用类型,中间又有装箱,拆箱动作,更有奇葩的string;

参见:TheGoProgrammingLanguageSpecification-type
参见:LearningGo-Types

Gofunction:多值返回;带命名的返回参数用法;闭包;函数是一等公民;高阶函数;函数也是一种基础类型,可以typexxxfunc为函数新定义一种类型;并发Go以h函数为载体;对象是附有行为的数据,而闭包是附有数据的行为

参见国外大牛:FunctionTypesinGo(Golang)
Go闭包:函数编程之闭包漫谈(Closure)Go语言(Golang)-闭包
Go函数式编程:Go函数式编程实践

Go参数传递:函数参数全部是传值:即使传递的是指针,传递的也是指针的拷贝;闭包引用外部变量是引用

所谓引用是指使用的不是指针,但是却有指针的效果,引用:a做为参数传递函数内部,函数内部修改a却改变了外部a的值

指针:*a作为参数传递到函数内部,函数内部修改了*a的值,外部a指向的值也发生改变;

参见:Go语言的传参和传引用这篇文章分析的非常到位时难得好文章

Goerror处理机制,error与nil关系,参见
Go中error类型的nil值和nil
国外这两篇文章写得也比较好,教你如何自定义error以返回更具体的错误;
ErrorHandlingInGo,PartI
ErrorHandlingInGo,PartII

Gonil也一直是困扰Go学习者的一个绊脚石

上面有篇errornil相关的文章

这里有陈一回的Interfacenil的文章Golang:详解interface和nil陈兄关于Go的几篇文章都非常接地气,建议都看了

Gopackage、全局const(常量)、var(变量)加载顺序,及package引用机制:

参见:老许翻译的那本《Go语言程序设计》

Goreflect:反射是一个强大的武器,是一个新手成为老手的必须涉猎的东西,也是元编程的一种方式,其性能相对来说不太高(灵活性也带来性能问题)
参见:官方版laws-of-reflection

翻译版的:The-laws-of-reflection我认为这是翻译的最好的一篇文章,融入了作者的思考和感悟

还有我的简写版的,更多的是个API的指引:Thelawsofreflection

反射小试身手:参考这篇在GOLANG中用名字调用函数Mikespook翻译的其他文章也非常棒
martini框架使用的经典DI库:inject教科书办实现注入

inject库代码非常晦涩,可以参考陈兄的这边经典文章Golang:Martini之inject源码分析这篇文章深入浅出,写的非常好反射与接口、Go类型系统关系非常密切,refelct.TypeOf返回的是接口的dynamictype,func(vValue)Type()Type返回value的type,reflect.Type表述的是underlyingtype

Gochannel和Gorutone使用方法;并发编程模式;实现原理.如果形容Go语言是一个皇冠,Goroutine和channel则是皇冠上的明珠,Go是CSB并发编程理论的实践者和改良派;Go将并发编程的复杂性降低了一个数量级,从此并发编程不再是某些自称“技术淫人”的专利;世界本应该如此简单,语言和编译器能做好的事情就不要让程序员瞎忙活,这是Go的哲学;

相关参考:

参见《Go并发编程》(说实在的,这本书写的没有达到我期望的水准,写的都是基础,语言有点啰嗦,挖的够深,但是拔的不高,所谓拔的不高就是没有系统的介绍并发设计模式)

参见Goroutine背后的系统知识

Go内存模型英文版中文版英文需要翻墙,有点晦涩难懂,中文的这一篇写的非常好,融入译者自己的思考,推荐阅读;

Go语言并发之美这篇文章写得非常好,对常用的并发模式写的深入浅出,这点《Go并发编程》一本很厚的书居然没有这些内容,实在让人失望,有点徒有虚名
GoogleIO大会上大牛的几篇文章(有墙)

ConcurrencyisnotParallelism这里有篇翻译的并发不是并行
GoConcurrencyPatterns
AdvancedGoConcurrencyPatterns
GoConcurrencyPatterns:Pipelinesandcancellation这里有篇翻译:Go并发模式:管道和显式取消

Go调度器模型,Go内存管理,GC,Go调试与性能分析,跨平台;这些都是高级命题,当程序遇到性能问题时,你可能需要去了解Go并发的实现机制,找到问题点,规避或者改进或者找到替代方案;除非你有强烈的好奇心,一般的程序员不会去读整个运行时的实现。

参见雨痕学习笔记

TheGoscheduler这里有篇翻译Go调度器
阿里skoo的几篇文章对调度器过程写的非常生动
《Go并发编程》对Go调度也做了论述
国外的这篇PPT写的也不错,还有一篇

5.框架学习:

学习了谢大的BeeGo 框架,BeeGo 非常容易入门,模块化设计,并且模块非常齐全;谢大人比较热情,QQ群较活跃,,我的两个小系统都是基于BeeGo 开发的;小黑的这篇导读对于想看框架源码的人来说是个福音;

Martini只是看了inject那部分,2015年希望有时间细看一下martini和revel。

6.期待

期待有个牛人能出一本专门介绍Go如何设计大系统的书,Go语言设计模式和面向对象设计模式有很大差别;老许有一篇PPT里面介绍Go的面向连接和组合的语言,以七牛系统的规模,应该可以抽象出一套模式出来,有人做吗?并发的相关设计模式,网上有多文章,但是还不是很系统;希望2015有人能站出来做这件事情,我们好站在巨人的肩膀上继续前行。

其实不是为了学习而学习:我很大一部分时间还是边开发,边了解标准库,边学习;遇到比较大的通用的模块到github上找有无已经实现的,如有借鉴过来吧,如果你认为自己改写的比原作者好,可以pullrequest.当然在开发中遇到自己知识的盲点,就需要有股专研的精神,把它搞明白,技术也就自然得到提高,个人薄见,谨慎参考。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。