Go
-
Moving a service from Go to Rust, an honest report
Four months, one service rewrite, the wins were not the ones I expected and the costs were larger than I thought
-
The panic in a goroutine that took down prod
A nil deref in a background worker crashed our whole service because Go's panic model doesn't care that you spawned a goroutine to handle errors safely
-
Deadline-wrapping an io.Reader
A small helper to cancel a slow read with a deadline, using context and a goroutine proxy.
-
http.Client tuning for a flaky upstream
A checklist of the settings I reach for when a Go service needs to talk to an upstream that's... not great
-
Build tags are the quiet power tool of Go
Conditional compilation in Go via build tags is simpler than most preprocessor systems and I use it more than I expected
-
Error wrapping conventions I settled on
After years of churn, the error handling style that has held up across three services and five engineers
-
Generics in Go, eighteen months later
What I use generics for, what I don't, and the subtle ways they interact with method sets and interfaces
-
go.sum conflicts during merges are always my fault
A short operational guide to resolving go.mod and go.sum conflicts without making the problem worse
-
The GC knob that actually helped
GOMEMLIMIT is the Go runtime environment variable I wish I'd known about a year earlier
-
httptest.Server is better than you think
Most Go HTTP tests I see are mocked when they should be using httptest.Server, and it shows
-
Benchmarking gotchas I learned the hard way
A collection of ways I made Go benchmarks lie to me, including the compiler optimizations I didn't know existed
-
The io.Reader pattern I keep getting wrong
Short reads, partial reads, and the difference between Read and ReadFull took me far too long to get right
-
When interfaces in Go bite you at the allocation level
Converting a concrete type to an interface is not free, and in hot paths it can account for a startling share of GC pressure
-
The pprof graph that taught me to read assembly
A CPU profile pointed at a line with a simple map lookup, and pprof's disasm view sent me down a real rabbit hole
-
sync.Pool is not a memory pool
A long rant about what sync.Pool actually guarantees, when it helps, and when it just gives you the illusion of helping