Further Reading
Unlike the rest of the reference track, this page is mostly external links — the docs, blog posts, and specs worth reading alongside each module. They’re grouped to match the guide’s tracks, so you can jump from a lesson straight to its primary sources.
A few ground rules for trusting these:
- Prefer the canonical docs (go.dev, protobuf.dev, grpc.io, postgresql.org) for anything spec-level. Blog posts are marked (blog) — great for intuition, not for resolving an argument.
- The Go spec, memory model, and generics are stable. Treat version-specific release notes as history, not as normative.
Language track
Section titled “Language track”The bedrock. Start with the spec and Effective Go; the rest are deep dives on one topic each.
Packages, modules, imports
Section titled “Packages, modules, imports”See Packages, Modules & Imports.
Types, structs, methods
Section titled “Types, structs, methods”| Resource | Why it matters |
|---|---|
| Effective Go | Idiomatic struct/method design; the canonical style reference. |
| Go spec: Types | Method sets, named vs. composite types, embedding rules. |
Interfaces & composition
Section titled “Interfaces & composition”| Resource | Why it matters |
|---|---|
| Effective Go: Interfaces | The “small interface” idiom. |
| Go Code Review Comments | Interface naming, “accept interfaces, return structs”, receiver types. |
| Go Proverbs | Rob Pike’s distilled wisdom — “the bigger the interface, the weaker the abstraction.” |
Pointers, values, memory
Section titled “Pointers, values, memory”| Resource | Why it matters |
|---|---|
| Go Slices: usage and internals (blog) | The slice header (ptr/len/cap) — the mental model that prevents aliasing bugs. |
| Arrays, slices: the mechanics of append (blog) | Why append may or may not reallocate. |
| Effective Go: Pointers vs. Values | When a method needs a pointer receiver. |
See Pointers, Values & Memory.
Errors
Section titled “Errors”| Resource | Why it matters |
|---|---|
| Error handling and Go (blog) | Errors as values; the original rationale. |
| Working with Errors in Go 1.13 (blog) | %w wrapping, errors.Is / errors.As. |
errors package docs | Canonical API for Is / As / Join / Unwrap. |
See Errors.
Generics
Section titled “Generics”| Resource | Why it matters |
|---|---|
| An Introduction to Generics (blog) | Type parameters and constraints. |
| When to Use Generics (blog) | The decision boundary — avoids over-abstraction. |
| Tutorial: Generics | A worked example, official. |
See Generics.
Concurrency
Section titled “Concurrency”| Resource | Why it matters |
|---|---|
| Go Concurrency Patterns: Pipelines and cancellation (blog) | Fan-out/fan-in with clean shutdown — the request-path pattern. |
| Share Memory by Communicating (blog) | The channel-first design philosophy. |
errgroup docs | Bounded concurrent work with first-error cancellation, as used in the codebase. |
See Concurrency.
Context
Section titled “Context”| Resource | Why it matters |
|---|---|
| Go Concurrency Patterns: Context (blog) | Cancellation/deadline propagation across API boundaries. |
context package docs | Canonical WithCancel / WithTimeout / WithValue semantics. |
See Context.
sync & the memory model
Section titled “sync & the memory model”| Resource | Why it matters |
|---|---|
| The Go Memory Model | Canonical happens-before rules — the basis for all correct synchronization. |
sync package docs | Mutex, RWMutex, Once, WaitGroup. |
sync/atomic docs | Typed atomics (atomic.Int64, atomic.Pointer). |
Stdlib & idioms
Section titled “Stdlib & idioms”| Resource | Why it matters |
|---|---|
| Effective Go | The idiom baseline. |
| Go Code Review Comments | Per-construct style conventions reviewers expect. |
slices / maps / cmp | Generic stdlib helpers (Go 1.21+). |
See Stdlib & Idioms.
Testing
Section titled “Testing”| Resource | Why it matters |
|---|---|
testing package docs | T, B, subtests, t.Helper, t.Cleanup. |
| Using Subtests and Sub-benchmarks (blog) | Table-driven structure with t.Run. |
goleak docs | Goroutine-leak detection, wired into the codebase’s test utilities. |
See Testing.
Project track
Section titled “Project track”These cover the real systems behind the running example — Vitess lineage, the RPC stack, the SQL parser, the wire protocol, and consensus. The asides flag where the codebase reuses an idea rather than the linked implementation.
Architecture & request flow
Section titled “Architecture & request flow”| Resource | Why it matters |
|---|---|
| Vitess docs | Multigres is “Vitess for PostgreSQL” — shared conceptual lineage. |
| What Is Vitess | The proxy/pooler/orchestrator split that multigateway/multipooler/multiorch mirror. |
See Architecture & Request Flow and Service Anatomy.
cmd & Cobra
Section titled “cmd & Cobra”| Resource | Why it matters |
|---|---|
| Cobra docs (repo) | The command-tree/flags/subcommands framework every binary uses. |
pflag docs | The POSIX flag parsing underpinning Cobra. |
See cmd & Cobra.
Config & viperutil
Section titled “Config & viperutil”| Resource | Why it matters |
|---|---|
| Viper docs | Layered config (flags/env/file) that the config layer wraps. |
fsnotify docs | Background for config live-reload (file watching). |
See Config & viperutil.
gRPC & Protobuf
Section titled “gRPC & Protobuf”| Resource | Why it matters |
|---|---|
| Protocol Buffers docs | .proto syntax, types, and schema evolution. |
| Go Generated Code guide | What protoc-gen-go emits and how to use it. |
| gRPC-Go docs | Server/client stubs from protoc-gen-go-grpc. |
| grpc-gateway docs | REST/JSON transcoding via protoc-gen-grpc-gateway. |
See gRPC & Protobuf.
Parser, lexer, AST, codegen
Section titled “Parser, lexer, AST, codegen”| Resource | Why it matters |
|---|---|
| PostgreSQL: The Parser Stage | The grammar model the SQL parser follows. |
PostgreSQL gram.y source | The authoritative rule reference the in-repo grammar derives from. |
golang.org/x/tools/cmd/goyacc | Go’s yacc port — lineage of the in-repo generator. |
See Parser, Lexer, AST & Codegen.
PG wire protocol & sqltypes
Section titled “PG wire protocol & sqltypes”| Resource | Why it matters |
|---|---|
| PostgreSQL Frontend/Backend Protocol | The wire protocol the pgprotocol package implements; a conformance suite runs against it. |
| Protocol Message Formats | Byte-level message layouts for encoding/decoding. |
pgx/v5 docs | A reference Go PG implementation; used as a client in tests. |
See PG Wire & sqltypes.
Consensus & failover
Section titled “Consensus & failover”| Resource | Why it matters |
|---|---|
| In Search of an Understandable Consensus Algorithm (Raft) | Background theory for leader election and log replication. |
| etcd docs | The etcd v3 client is used for topology and service discovery. |
See Consensus & Failover.
mterrors & observability
Section titled “mterrors & observability”| Resource | Why it matters |
|---|---|
| OpenTelemetry Go docs | The metrics/tracing stack (go.opentelemetry.io/otel). |
log/slog docs | The structured logging used across services. |
| gRPC status codes | How RPC errors map to codes the error layer must translate. |
| Prometheus docs | Background for the metrics catalog and exposition. |
Tooling track
Section titled “Tooling track”The conventions and tools that the build, lint, and codegen workflows lean on.
| Resource | Module |
|---|---|
| Conventional Commits | Build & Make — the commit/PR convention the project follows. |
| golangci-lint docs | Lint & Format |
| gofumpt · goimports | Lint & Format — formatters configured with a local import prefix. |
| Go Generated Code guide | Modules, Deps & Codegen |