Gopher Reading List
Here is a reading list of blog posts about Go. It aspires to include only the most useful and relevant material that anyone writing Go should eventually read. By definition, the list is a work in progress.
Rather than being comprehensive, the list is a curated selection fixed at 200 entries.
Go is growing fast and so are the number of blog posts about it. If an interested reader knows of a great post not on this list, please open an issue with a link to the post.
NOTE: Any new additions will need to replace something else on the list to keep it at a fixed length.
Start Here
- Why should you learn Go?
- How to Write Go Code
- A Tour of Go
- Frequently Asked Questions
- Go Koans
- Go by Example
- Go Bootcamp
Beginner
Some basics
- Understand Go pointers in less than 800 words or your money back | Dave Cheney
- Channel Axioms | Dave Cheney
- Golang channels tutorial | Alexander Guz's blog
- (Now You're) Thinking With Channels
- Go Defer Simplified with Practical Visuals
- Understanding Go panic output
- How to avoid Go gotchas · divan's blog
- Common Gotchas in Go
- 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs
- Slice Tricks
- 6 Tips for Using Strings in Go
- Unofficial Go FAQ
Worth reading, again and again
- Effective Go
- Visualizing Concurrency in Go
- Strings, bytes, runes and characters in Go - The Go Blog
- Arrays, slices (and strings): The mechanics of 'append' - The Go Blog
Organization and Style
- Code Review Comments
- command center: Less is exponentially more
- Go Proverbs
- Idiomatic Go
- Errors
- When Should I Use One Liner if...else Statements in Go?
- Go's Error Handling is Elegant
- Effective error handling in Go. - Morsing's blog
- The One with the Directory Structure and Manual Wiring
- Five Suggestions for Setting up a Go project
- Structuring Tests in Go
- Organizing Go Code
- The anatomy of a Go project - darian.af
- Structuring Applications in Go
- Style guideline for Go packages · Go, the unwritten parts
- Package names
- The empty struct
- For Range Semantics - GoingGo - Ardan Labs
- How I Learned To Quit Worrying And Love Go's Interfaces
- How to use interfaces in Go
Web
- Creating My First Web Application with Go
- Making a RESTful JSON API in Go - The New Stack
- Golang HTTP server for pro
- How to Serve Static Files with Golang
- An Intro To Templates in Go - Contextual Encoding
- Elliot Chance - Working With JSON in Go
- Web Scraping with Go
- JSON APIs Are Just Web Applications
- HTTP File Upload and Download with Go - zupzup
- Writing middleware in #golang and how Go makes it so much fun.
- Go and JSON - Eager Blog
- Learn Web Programming in Go by Examples
Concurrency
- Learning Go's Concurrency Through Illustrations
- Data races in Go(Golang) and how to fix them
- Multithreading in Go - A Tutorial
Intermediate
Code Design
- Go best practices, six years in
- Aspects of a good Go library – Jack Lindamood – Medium
- Solid Go Design
- Go for Industrial Programming
- Go’s std net/http is all you need … right? – Dean Karn – Medium
- What “accept interfaces, return structs” means in Go
- How to Use Go Interfaces
- Pitfalls of context values and how to avoid or mitigate them in Go
- Dependency Injection in Go
- How to ship production-grade Go - O'Reilly Media
- Loose Coupling in Go lang | 8th Light
- Self-referential functions and the design of options
- Functional Options for Friendly APIs
- Object Oriented Inheritance in Go
Concurrency
- Concurrency Patterns: Golang
- Stopping goroutines #golang
- Ways to limit concurrent resource use - Pocket Gophers
- Make Ctrl+C cancel the context.Context – Mat Ryer – Medium
- Cancelling Multiple Goroutines
- How to correctly use context.Context in Go 1.7 – Medium
- Using contexts to avoid leaking goroutines · go bits
- Go Concurrency Patterns: Pipelines and cancellation - The Go Blog
- Tutorial: Synchronizing State with Mutexes in Go
- Context
- Context and Cancellation of goroutines - http://dahernan.github.io
- Dancing with Go's Mutexes
- GoRoutines, Channels, and Proper Exits - Rabarar's Blog
- Buffered channels in Go: Tips & Tricks
- How to Block Forever in Go
- Mutex Profile
- Sane Concurrency with Go | Mozilla Services
- Goroutine Tracing
- Error handling patterns in Go
Testing
- Testing Web Apps in Go | Mark J. Berger
- An Introduction to Testing in Go | TutorialEdge.net
- 5 simple tips and tricks for writing unit tests in #golang
- 5 Advanced Testing Techniques in Go · Segment Blog
- The Cult of Go Test
- Interfaces and Composition for Effective Unit Testing in Golang
- Go Testing Technique: Testing JSON HTTP Requests — Medium
- Acceptance Testing Go Web Applications with Cookies
- Testing Your (HTTP) Handlers in Go
- Go test your tests in Go with go test
- Learn Go with tests
- Unit Testing Golang HTTP Middleware
- Lesser-Known Features of Go Test - Blog | Splice
- When Writing Unit Tests, Don’t Use Mocks
Web
- Exposing Go on the Internet
- The complete guide to Go net/http timeouts
- HTTP(S) Proxy in Golang in less than 100 lines of code
- Write a Kubernetes-ready service from zero step-by-step GopherAcademy
- How to not use an http-router in go
- How To Write Router Tests in Go — Tapjoy Engineering
- A brief intro of TCP keep-alive in Go’s HTTP implementation | Nan Xiao's Blog
- Build a Web Crawler in Go
- Your pprof is showing: IPv4 scans reveal exposed net/http/pprof endpoints:
- HTTP Request Contexts & Go · go, web, go
- Using Object-Oriented Web Servers in Go - via @codeship | via @codeship
- Handle HTTP Request Errors in Go @ Alex Pliautau's Blog
- Go json.Decoder Considered Harmful
- Building High Performance APIs In Go Using gRPC And Protocol Buffers
- Implementing UDP vs TCP in Golang - Mina Andrawos
- Don't use Go's default HTTP client (in production)
- Writing an API Client in Go GopherAcademy
- Seeking around in an HTTP object GopherAcademy
- Using Functions Inside Go Templates - Calhoun.io
- Writing a Data Mapper in Go without an ORM
- Practical Persistence in Go: Organising Database Access
- How I write Go HTTP services after seven years
Tools
- Go tooling essentials · Go, the unwritten parts
- Profiling Go Programs - The Go Blog
- Go Tooling in Action — Google Cloud Platform — Community — Medium
- Using Go as a scripting language in Linux
Trivia
- 10 things you (probably) don't know about Go
- Gopher Puzzlers
- Go gotcha: newbie or ninja?
- Advanced Go Tips And Tricks | Tit Petrič
- Golang slices gotcha · allegro.tech
Diagnostics
- Diagnostics - The Go Programming Language
- Profiling Go
- Understanding Go Lang Memory Usage
- Five things that make Go fast
- Logging, interfaces, and allocation · Don't Panic
- Practical Go Benchmarks
Language
- Golang: pass by pointer vs pass by value
- There is no pass-by-reference in Go | Dave Cheney
- Variadic functions in Go
- Crossing Streams: a Love Letter to io.Reader
- Function Types in Go (golang)
- research!rsc: Go Data Structures
Miscellaneous
- Always Be Closing
- Don't defer Close() on writable files
- Examples For Using io.Pipe in Go - zupzup
- How to Use go:generate
- Writing worker queues, in Go
- Job Queues in Go - OpsDash
- Working with Files in Go | DevDungeon
- Reading files in Go — an overview
- Golang: Working with Gzip and Tar
- Go Walkthrough: bytes + strings packages
Advanced
Low Level Concerns
- Go's work-stealing scheduler · Go, the unwritten parts
- The Go scheduler - Morsing's blog
- Go Assembly by Example
- Address Alignments in Go
- Hacking the Scheduler
- The Go netpoller - Morsing's blog
- Anatomy of a function call in Go
- Scheduler Tracing in Go
- Manual Memory Management in Go
- unsafe.Pointer and system calls GopherAcademy
- Type-Unsafe Pointers
- Looking at your program’s structure in Go 1.7 · Paul Smith
- Managing Syscall Overhead with crypto/rand · Scott Mansfield
- Optimized abs() for int64 in Go
Performance
- Allocation Efficiency in High-Performance Go Services
- Handling 1 Million Requests per Minute with Go
- Go code refactoring : the 23x performance hunt
- A Million WebSockets and Go – freeCodeCamp
- go-perfbook
Garbage Collection
- Allocation Efficiency in High-Performance Go Services · Segment Blog
- Golang's Real-time GC in Theory and Practice - Pusher Blog
- How to Optimize Garbage Collection in Go | Cockroach Labs
Concurrency
- Advanced Go Concurrency Patterns - The Go Blog
- Multiplexing Golang Channels to Maximize Throughput | The MongoDB Engineering Journal
- Golang lock-free values with atomic.Value
- Stateful locks in Go - Tit Petric
- Share Memory by Communicating
- Concurrency is not parallelism
- Go Concurrency Patterns: Context
- Go Concurrency Patterns: Timing out, moving on
- Concurrency, Goroutines and GOMAXPROCS
- Locking in crypto/rand
Character encodings
- Text normalization in Go - The Go Blog
- TechnoSophos: Go Quickly - Converting Character Encodings In Golang