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 defintion, 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 sees a glaring omission, please open a pull request. Include your suggestion of what to add and what to remove to keep the list at its fixed length.
Start Here
- Go Koans
- A Tour of Go
- Frequently Asked Questions
- Go by Example
- Go Bootcamp
Beginner
Some basics
- Slice Tricks
- 5 Tips for Using Strings in Go
- Struct, Map, Array and Slice
- Understand Go pointers in less than 800 words or your money back | Dave Cheney
- Tutorial: Go (Golang) Pointers in 5 Minutes | Giant Flying Saucer
- Pointers
- Golang channels tutorial | Alexander Guz’s blog
- (Now You’re) Thinking With Channels
- Channel Axioms | Dave Cheney
- Curious Channels
- 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
- 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
- Go’s Error Handling is Elegant
- Effective error handling in Go. – Morsing’s blog
- Alternative Patterns for Method Overloading in Go
- Five Suggestions for Setting up a Go project
- Structuring Tests in Go
- Organizing Go Code
- The anatomy of a Go project – darian.af
- Standard Package Layout
- Style guideline for Go packages · Go, the unwritten parts
- time in go
- 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
- How to Serve Static Files with Golang
- An Intro To Templates in Go – Contextual Encoding
- Elliot Chance – Working With JSON in Go
- Making concurrent HTTP requests in Go programming language – Jinchuriki
- Golang http handlers as middleware – @capotej
- A TCP Echo Server in Go (Golang) | Jim Lawless’ Blog
- HTTP File Upload and Download with Go – zupzup
- Simple Golang HTTP Request Context Example · Paul Fortin
- Go and JSON – Eager Blog
- Writing HTTP Middleware in Go
- Learn Web Programming in Go by Examples
Concurrency
- 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
- The package level logger anti-pattern
- Go’s STD NET/HTTP is all you need… right? – Dean Karn – Medium
- What “accept interfaces, return structs” means in Go
- Golang: interface{}, type assertions and type switches
- Ensuring Go interface satisfaction at compile-time
- Pitfalls of context values and how to avoid or mitigate them in Go
- Structuring Applications for Growth
- 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
- 8. 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
- Use sync.WaitGroup in Golang | Nan Xiao’s Blog
- 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
- Testing concurrent code in Golang – JS Blog
- Compile-time assertions in Go · Don’t Panic
- Unit Testing Golang HTTP Middleware
- Lesser-Known Features of Go Test – Blog | Splice
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 the Go ‘s HTTP implementation | Nan Xiao’ s Blog
- Go: Marshal and Unmarshal JSON with time and URL data – Ukiah Smith
- Your pprof is showing: IPv4 scans reveal exposed net/http/pprof endpoints:
- HTTP Request Context & 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 Microservices blog series, part 1. | Callista Enterprise
- 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
- Configuring Go Apps with TOML – Benaiah Mischenko
- Writing a Data Mapper in Go without an ORM
- Practical Persistence in Go: Organising Database Access
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?
- The 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
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
- Reducing boilerplate with go generate
- Writing worker queues, in Go
- Job Queues in Go – OpsDash
- Working with Files in Go | DevDungeon
- Read files in Go – an overview
- Golang: Working with Gzip and Tar
- Go Walkthrough: bytes + strings packages
Advanced
Low Level Concerns
- · 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
- Scalable Go Scheduler Design Doc
- Scheduler Tracing in Go
- Manual Memory Management in Go
- unsafe.Pointer and system calls GopherAcademy
- Looking at your program’s structure in Go 1.7 · Paul Smith
- Overhead with Crypto/Rand Scott Mansfield
Performance
- Allocation Efficiency in High-Performance Go Services
- Optimized abs() for int64 in Go
- Profiling memory usage of a Go app | Vince Yuan’s technical blogs
- allegro.tech – Writing a very fast cache service with millions of entries in Go
- 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
- Debugging a potential deadlock in Go
- 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
JSON Encoding and Decoding
- Advanced Encoding and Decoding Techniques
- Custom JSON Marshalling in Go · Choly’s Blog
Miscellaneous
- Mutable strings in Golang — Koki — Medium
- Minimal Perfect Hash Functions
- Go Experience Report for Generics: Google metrics API
- Advanced Reflection with Go at HashiCorp GopherAcademy
- go-fuzz github.com/arolek/ase – Damian Gryski