Test a Go REST API with httptest, a fake store, log assertions, the race detector and fuzzing. Then ship it with server timeouts, graceful shutdown and one static binary.
A task-list REST API in Go with no third-party packages. Build the store, routes, safe JSON decoding, validation, status codes, middleware and slog logging, one layer at a time.
Go’s standard library ships a production HTTP server. Learn handlers, routing with ServeMux method and path patterns, the rules of ResponseWriter, what happens to each request, and why http.Server needs timeouts.
A Go context tells every goroutine working on a job when to stop. Learn cancellation, timeouts and request values, then build a worker pool, a pipeline, fan-out, an errgroup and a semaphore that never leak.
Two goroutines that change the same variable without coordination produce a data race and quietly lose updates. Learn how sync.Mutex, RWMutex, atomic and Once prevent it, and how go run -race finds it.
A Go channel passes values between goroutines and makes them wait for each other. Learn unbuffered and buffered channels, closing, deadlocks, nil channels, and how select waits on several at once.
A goroutine is a function running alongside the rest of your program, and Go can run thousands of them at once. Learn how to start them, wait for them, avoid leaking them, and how the scheduler shares a few threads between them.
Go decides for you whether a value lives on the stack or the heap. See how escape analysis makes that call, how to watch it with go build -gcflags=-m, how to count allocations, and what the garbage collector does next.
Go generics let one function work for many types, with constraints saying which types are allowed. Iterators let a function hand out values one at a time to a for loop, and stop the moment the loop breaks.
A Go module is a tree of packages under one go.mod file. Learn how import paths, exported names and internal folders work, then test the code with table-driven tests, subtests, examples and benchmarks.