Go Generics in 2026: The Type Parameters I Actually Reach For
Go generics turned four. Here's where I actually reach for type parameters in real Go code, the constraints I lean on, and the patterns I…
Go generics turned four. Here's where I actually reach for type parameters in real Go code, the constraints I lean on, and the patterns I…
The Go error handling patterns I actually use in production: wrapping with %w, errors.Is and errors.As, sentinel errors, and errors.Join, with code.
Gin, Echo, Fiber, Chi, or plain net/http? I've shipped Go services on all of them. Here's the honest read on which one I reach for…
Go 1.21's log/slog brought structured logging into the standard library. Here's what it replaced for me, where it shines, and the one part I still…
Go 1.25 added WaitGroup.Go and a stable testing/synctest. Here are the Go concurrency patterns I actually use in 2026, and the boilerplate I deleted.
I've shipped production services in both Rust and Go. Here's the decision framework I actually use, with code, honest trade-offs, and no benchmark wars.
Four years into Go generics, here is what I actually reach for in production, the constraints I write, and the patterns I quietly stopped using.
The Go error patterns I actually use in production: fmt.Errorf %w wrapping, sentinel vs typed errors, errors.Is vs errors.As, and errgroup at scale.
Four years with testify, then I migrated off it. What I kept (assert and require), what I dropped (mock and suite), and the plain-Go alternatives…
I ignored Go 1.23 iterators for almost a year. Here's what finally made me reach for them, where they're worth it, and the footgun that…