接触go是2012年的时候,真正开始系统的学习和开发系统是2014年了,go语言的学习也算自己2014年的重要工作之一,对go语言学习的总结,也算是年底总结之一
1.学习go的原因和动机:
1>先前做过2年Unix c开发经验, 对于C系的语言有特殊的感情,go特别适合我胃口,用过后爱不释手;
2>go语言团队太过耀眼和强大:Thompson 图灵奖获得者,unix 和C的共同发明人;Pike PLAN9操作系统的主要开发者、UTF-8发明者;Robert Griesemer 参与java的HotSpot, js v8引擎开发者;
3>国内传道者的极力推荐:许式伟兄,谢孟军兄等强力推荐及相关书籍问世;
2.学习资料:
书籍是:老许的《go语言编程》、 老谢的《go web编程》、 雨痕的《go 语言学习笔记》、 golang.org上面的《Effective Go》、《The Go Programming Language Specification》、go标准库和github上众多开源库
当然无闻的视频教程也是非常适合初学者的,跟着他一起把代码敲一遍事半功倍
3.go 学习体会:
go 语言基础知识非常简单,简单到几天就可以学完,并能够上手开发;但是要做到精通,没有一定的代码量和几年的经验很难达到,这是学习任何一门编程语言都必须要经历的,你唯一能做的是:不停的写代码,不停的思考,不停的总结,不停的读别人代码,向高手请教;
4.go 学习难点,将我在学习中遇到的难点,以及相关参考资料索引出来,这些知识点对新入门的学习者有点难,但是对于想全面掌握go技能的开发人员来说,我认为是非常有价值的,这些知识点都是个人一步步学习趟过坑之后去发掘的:
Go Data Structures
Arrays, slices (and strings): The mechanics of 'append'
使用Defer的几个场景
参见:老许《Go语言编程》 第9章 9.5节 接口机理
参加:国外一位大佬写的:How to use interfaces in Go
参见:interfaces_and_types
参见:Learning Go - Interfaces & Reflections
参见:The Go Programming Language Specification-type
参见:Learning Go - Types
参见国外大牛:Function Types in Go (golang)
go闭包:函数编程之闭包漫谈(Closure) Go语言(Golang) - 闭包
go函数式编程:go函数式编程实践
指针:*a作为参数传递到函数内部,函数内部修改了*a的值,外部a指向的值也发生改变;
参见:Go语言的传参和传引用 这篇文章分析的非常到位时难得好文章
Go中error类型的nil值和nil
国外这两篇文章写得也比较好,教你如何自定义error以返回更具体的错误;
Error Handling In Go, Part I
Error Handling In Go, Part II
上面有篇 error nil 相关的文章
这里有陈一回的 Interface nil 的文章 golang: 详解interface和nil 陈兄关于go的几篇文章都非常接地气,建议都看了
参见:官方版 laws-of-reflection
翻译版的:The-laws-of-reflection 我认为这是翻译的最好的一篇文章,融入了作者的思考和感悟
还有我的简写版的,更多的是个API的指引:The laws of reflection
反射小试身手:参考这篇在 GOLANG 中用名字调用函数 Mikespook翻译的其他文章也非常棒
martini 框架使用的经典DI库:inject 教科书办实现注入
inject库代码非常晦涩,可以参考陈兄的这边经典文章golang: Martini之inject源码分析 这篇文章深入浅出,写的非常好
反射与接口、go类型系统关系非常密切,refelct.TypeOf 返回的是接口的dynamic type , func (v Value) Type() Type返回value的type, reflect.Type表述的是underlying type
相关参考:
参见《go并发编程》(说实在的,这本书写的没有达到我期望的水准,写的都是基础,语言有点啰嗦,挖的够深,但是拔的不高,所谓拔的不高就是没有系统的介绍并发设计模式)
参见goroutine背后的系统知识
go 内存模型 英文版 中文版 英文需要,有点晦涩难懂,中文的这一篇写的非常好,融入译者自己的思考,推荐阅读;
go语言并发之美 这篇文章写得非常好,对常用的并发模式写的深入浅出,这点《go并发编程》一本很厚的书居然没有这些内容,实在让人失望,有点徒有虚名
Google IO大会上大牛的几篇文章(有墙)
Concurrency is not Parallelism 这里有篇翻译的并发不是并行
Go Concurrency Patterns
Advanced Go Concurrency Patterns
Go Concurrency Patterns: Pipelines and cancellation 这里有篇翻译:Go并发模式:管道和显式取消
参见雨痕学习笔记
The Go scheduler 这里有篇翻译go调度器
阿里skoo的几篇文章 对调度器过程写的非常生动
《go并发编程》对go调度也做了论述
国外的这篇PPT写的也不错 ,还有一篇
github上有本电子书 写的非常深入,对go的几个关键点实现进行深入剖析,非常好的文章
5.框架学习:
学习了谢大的beego框架,beego非常容易入门,模块化设计,并且模块非常齐全;谢大人比较热情,QQ群较活跃,,我的两个小系统都是基于beego开发的;小黑的这篇导读对于想看框架源码的人来说是个福音;
Martini 只是看了inject那部分,2015年希望有时间细看一下 martini 和 revel。
6.期待
期待有个牛人能出一本专门介绍 go 如何设计大系统的书,go语言设计模式和面向对象设计模式有很大差别;老许有一篇PPT里面介绍go的面向连接和组合的语言,以七牛系统的规模,应该可以抽象出一套模式出来,有人做吗?并发的相关设计模式,网上有多文章,但是还不是很系统;希望2015有人能站出来做这件事情,我们好站在巨人的肩膀上继续前行。
备注:既然等了几年还是没有人写一本书,老衲自己动手写了一本书,重点讲述go语言最核心的几个知识点:类型系统,接口和并发,电子工业出版社出版,估计书名是《Go核心编程》或者《Go高级编程》,预计18年8月份能出版,敬请大家耐心等待。
其实不是为了学习而学习: 我很大一部分时间还是边开发,边了解标准库,边学习;遇到比较大的通用的模块到github上找有无已经实现的,如有借鉴过来吧,如果你认为自己改写的比原作者好,可以pull request. 当然在开发中遇到自己知识的盲点,就需要有股专研的精神,把它搞明白,技术也就自然得到提高,个人薄见,谨慎参考。