- 掌握Go语言基础
- 掌握测试驱动方法(TDD)
- Install Go - Set up environment for productivity.
- Hello, world - 声明变量,常量,if/else 语句,switch 语句,编写第一个 go 程序和测试代码。子测试(subtests)语法和闭包。
- 整数Integers - 进一步学习函数声明语法,学习改进代码文档的新方法。
- 循环 - 学习
for
循环和性能比对测试(benchmarking)。 - 数组Array和切片Slices - 学习数组(Array),切片(Slice),
len
函数,可变数量参数(varargs),range
函数和测试覆盖率(Test Coverage)。 - 结构体struct、方法method和接口interface - 学习结构体
struct
, 方法methods, 接口interface
和表驱动测试. - 指针Pointers和错误errors - 学习指针和错误。
- 字典Maps - 学习如何在字典数据结构中存储值。
- 依赖注入DI - 学习依赖注入, 它和接口的关系, 简单介绍io包。
- Mocking - 学习使用mock测试,覆盖那些使用常规测试无法覆盖的代码。
- 并发 - 学习如何写并发程序,让软件运行更快。
- 选择Select - 学习如何优雅地在进程间进行同步。
- 反射 - 学习反射。
- Sync - Learn some functionality from the sync package including
WaitGroup
andMutex
- Context - Use the context package to manage and cancel long-running processes
- Intro to property based tests - Practice some TDD with the Roman Numerals kata and get a brief intro to property based tests
- Maths - Use the
math
package to draw an SVG clock
Now that you have hopefully digested the Go Fundamentals section you have a solid grounding of a majority of Go's language features and how to do TDD.
This next section will involve building an application.
Each chapter will iterate on the previous one, expanding the application's functionality as our product owner dictates.
New concepts will be introduced to help facilitate writing great code but most of the new material will be learning what can be accomplished from Go's standard library.
By the end of this, you should have a strong grasp as to how to iteratively write an application in Go, backed by tests.
- HTTP server - We will create an application which listens to HTTP requests and responds to them.
- JSON, routing and embedding - We will make our endpoints return JSON and explore how to do routing.
- IO and sorting - We will persist and read our data from disk and we'll cover sorting data.
- Command line & project structure - Support multiple applications from one code base and read input from command line.
- Time - using the
time
package to schedule activities. - WebSockets - learn how to write and test a server that uses WebSockets.
I often run in to questions on the internets like
How do I test my amazing function that does x, y and z
If you have such a question raise it as an issue on github and I'll try and find time to write a short chapter to tackle the issue. I feel like content like this is valuable as it is tackling people's real questions around testing.
- OS exec - An example of how we can reach out to the OS to execute commands to fetch data and keep our business logic testable/
- Error types - Example of creating your own error types to improve your tests and make your code easier to work with.
- This project is work in progress If you would like to contribute, please do get in touch.
- Read contributing.md for guidelines
- Any ideas? Create an issue
I have some experience introducing Go to development teams and have tried different approaches as to how to grow a team from some people curious about Go into highly effective writers of Go systems.
An approach we tried was to take the blue book and every week discuss the next chapter along with the exercises.
I love this book but it requires a high level of commitment. The book is very detailed in explaining concepts, which is obviously great but it means that the progress is slow and steady - this is not for everyone.
I found that whilst a small number of people would read chapter X and do the exercises, many people didn't.
Katas are fun but they are usually limited in their scope for learning a language; you're unlikely to use goroutines to solve a kata.
Another problem is when you have varying levels of enthusiasm. Some people just learn way more of the language than others and when demonstrating what they have done end up confusing people with features the others are not familiar with.
This ends up making the learning feel quite unstructured and ad hoc.
By far the most effective way was by slowly introducing the fundamentals of the language by reading through go by example, exploring them with examples and discussing them as a group. This was a more interactive approach than "read chapter x for homework".
Over time the team gained a solid foundation of the grammar of the language so we could then start to build systems.
This to me seems analogous to practicing scales when trying to learn guitar.
It doesn't matter how artistic you think you are, you are unlikely to write good music without understanding the fundamentals and practicing the mechanics.
When I learn a new programming language I usually start by messing around in a REPL but eventually, I need more structure.
What I like to do is explore concepts and then solidify the ideas with tests. Tests verify the code I write is correct and documents the feature I have learned.
Taking my experience of learning with a group and my own personal way I am going to try and create something that hopefully proves useful to other teams. Learning the fundamentals by writing small tests so that you can then take your existing software design skills and ship some great systems.
- People who are interested in picking up Go.
- People who already know some Go, but want to explore testing with TDD.
- A computer!
- Installed Go
- A text editor
- Some experience with programming. Understanding of concepts like
if
, variables, functions etc. - Comfortable with using the terminal
- Add issues/submit PRs here or tweet me @quii
Logo is by egonelbre What a star!