Go语言学习笔记:学习资料汇总
最近难得放假,想好好学习一下Go,毕竟C++用的我欲仙欲死,而平时比较常用的.NetCore也不是编译语言(Compiled Language),经常遇到一些神奇的限制……
学一门新语言说容易也容易,毕竟语法也就那么一些,而且Go非常精简,只有仅仅25个保留字,但是说难也难,要真正理解一门语言真的需要花费不少的心思,特别我属于那种不了解到一定程度连用都不敢用的人(在工作中经常因为需要使用一些库,就把这些库的实现通读一遍……),于是查找了不少的学习资料。我觉得这些资料对于新手上路真的非常有用,所以把他们都记录在这,希望也会对其他对Go感兴趣的朋友有所帮助。
那就让我们开始吧!
1. 基础入门
首先,我们先从最基础的开始:
- 弄明白怎么使用是第一步,官方的示例讲解必不可少:A Tour of Go
- 接下来,可以系统的看看Go语言的方方面面,Go语言圣经gopl当仁不让:gopl.io,而且还有中文版!
- 在了解了Go语言本身之后,我们还可以看看语言的一些最佳实践,官方的Effective Go绝对值得一读:https://golang.org/doc/effective_go.html
至此,基础入门肯定是没有问题了,但是如果你是从C/C++这种比较传统的编译语言转过来的,估计到这里会一头雾水 —— 语法我都懂了,但是为什么呢?比如,为什么Go的struct成员变量和函数不提供const修饰?为什么没有信号量?使用嵌入代替继承看着很好,但是多态用起来经常却经常踩坑?这些问题我们就需要更多的资料来帮忙了。
2. Go语言之禅
和Python一样,Go在设计的时候也有自己的哲学思想。但是与Python不同,Python的哲学在语言设计非常早期就提了出来,并尝试着围绕它来建立语言,Go虽然有很多贯彻始终的思想,但是却很少有非常好的总结,而偏偏理解语言的设计理念是真正理解一门语言的关键。这里有一些零散的资料和文章,都是宝藏,可以参考学习:
- Go Proverbs:(YouTube: Go Proverbs - Rob Pike - Gopherfest - November 18, 2015)
- The Zen of Go:这篇文章非常有意思,作者觉得Go Proverbs总结的其实不是非常到位,并提出了自己的总结,句句直击要害,非常的赞。
- SOLID Go Design:读过《敏捷软件开发》,这本书的人肯定不会对SOLID陌生,这篇文章主要描述了SOLID原则在Go语言设计时的应用和如何利用SOLID原则设计我们的Go程序代码。
这里还有一些语言设计思想相关的扩展阅读:
- Share Memory By Communicating:Go Proverbs的延展阅读,能帮助理解上面提到的为什么Go中没有提供const修饰。这里需要从语言开发者的角度来看这个问题,理解Go在设计异步模型时的初衷。在读这篇文章的时候,也推荐大家阅读和Actor模型相关的文章,比如这里强烈推荐Actor模型创造者对Actor模型的解释:Hewitt, Meijer and Szyperski: The Actor Model (everything you wanted to know…)
- Concurrency is not parallelism:老问题常谈,并发(Concurrency)和并行(Parallelism)的区别。
3. 异步编程与并发模式
Go里面大家最关心的功能之一(或许没有之一),就是异步和并发了,所以这里我们先来看看他们:
- The Go Memory Model:介绍了Go的并发同步相关的各种API(Memory model指的不是GC,而是内存访问控制)
- Never start a goroutine without knowing how it will stop
- Go Concurrency Patterns: Timing out, moving on:最简单的Timeout实现(Timeouts and Deadlines)
- Go Concurrency Patterns: Pipelines and cancellation:
- Channel真的是一个非常好的东西,在这篇文章里面可以学到非常多的Channel的应用,比如Pipe,生成器,文章还对错误处理给出了Go风格解决方案。
- 耗子哥写了一篇中文的,虽然内容没有原版多,但都是精华:GO编程模式:Pipeline
- Go Concurrency Patterns: Context:请求管理进阶,context包的使用和context tree的解释。
- Context isn’t for cancellation:Context这个包虽然好用,但是它并不正交,于是引起了很多异议,比如这一篇。
- Advanced Go Concurrency Patterns:通过一个实例来介绍如何使用Go进行并发编程,Go提供了怎样的调试工具来帮助我们找到问题。
- Rethinking Classical Concurrency Patterns:这是一个很长的Slides,里面有很多关于Go并发编程的思考。
4. 代码风格
- Clear is better than clever
- Should methods be declared on T or *T:初学Go的时候,在实现成员函数时会经常弄不清楚什么时候用T,什么时候用*T,这篇文章给出了非常好的而且非常简单的答案。
- Go, without package scoped variables:因为全局变量是不好的,所以文章尝试实验没有全局变量的语言实现,文章还提出了很多对于公开和私有的包全局变量的建议。
- Simplicity and collaboration
还有一些和包管理相关的内容:
5. 错误处理
- Go package: errors
- Errors are values:文章介绍了一些错误处理的方案,从而帮助简化代码流程,并让错误处理变得更加的清晰。
- Don’t just check errors, handle them gracefully:这篇文章堪称精彩,解决了我对错误处理很多的困惑,而且不仅仅限于Go语言,而更多的是如何进行错误处理的思想。
- Go编程模式:错误处理
- Go 2 Draft Designs
- Let’s talk about logging:这篇文章的观点非常的有意思,需要对Go的错误处理有一些理解之后再阅读比较好,建议再读完上面和错误处理相关的所有内容之后再读。
6. 语言和设计模式
- Go编程模式:切片,接口,时间和性能
- Immutability
- 泛型:
- Go编程模式:Go Generation:由于Go不支持泛型,而反射(Reflect)会带来很多问题,比如运行时错误和性能问题,Go为此提供了暂时的解决方案:Generation。
- 这里可以看到更多关于Go泛型支持的进展:
- 函数对象和高阶函数:
- Do not fear first class functions
- Go编程模式:Functional Options:非常好用的高阶对象的应用!强烈推荐一读。
- Go编程模式:Map-Reduce:缺乏泛型和通用遍历接口的MapReduce,真的……很尴尬。
- 常见的编程模式
- Go编程模式:委托和反转控制:依赖反转原则的应用,耗子哥写的真的很好,顺便推荐另一篇耗子哥写的文章:IOC/DIP其实是一种管理思想。
- Go编程模式:修饰器
- Go编程模式:k8s Visitor 模式
- Moving Towards Domain Driven Design in Go
7. 调试相关
- pprof:Go自带的Profiler,功能还是非常强大的,不过是侵入式的,使用的时候需要注意。
- A whirlwind tour of Go’s runtime environment variables
- Introducing the Go Race Detector
8. 编译和Runtime
- 深度探索Go对象模型
- Stack Trace In Go
- A Quick Guide to Go’s Assembler:想真正了解Go内部都在做什么,了解Assembler是必须的
- 在看Go的Assembler之前推荐花几分钟先读一下Plan9的汇编spec,因为很多语法和我们现在常见的x86和amd64汇编差别很大。
- Go Internals也是一个不错的阅读材料,把所有东西总结到了一起,比较容易读懂。
- How a Go Program Compiles Down to Machine Code:简单的介绍了Go编译的Pipeline,也提供了一些很有用的调试编译器的方法,比如如何查看Static Single Assignment (SSA)。
- Go语言设计与实现:神书一本,放在最后,因为非常的艰深,对语言底层实现感兴趣的童鞋绝对不容错过!
9. 最后
目前大概就看了这些资料,毕竟是一个新手,只是利用业余时间学习学习,可能不会涉及太多非常深入的内容。如果大家有更多的推荐,欢迎多多交流,共同学习进步~
原创文章,转载请标明出处:Soul Orbit
本文链接地址:Go语言学习笔记:学习资料汇总