Go errors are plain values you return and check. Learn to wrap them with context, find the cause with errors.Is and errors.As, join several at once, and keep panic and recover for real bugs.
A Go interface is a list of methods, and any type with those methods satisfies it without saying so. Learn method sets, Stringer, io.Reader, type switches, and why an error holding a nil pointer isn’t nil.
Go structs are values, so every assignment and every call copies them. Pointers let you share one struct instead, and pointer receivers are how methods change the value they’re called on.
A Go string is a read-only row of bytes, usually UTF-8. Once you see that, len counting bytes, indexing giving a byte, range giving runes, and a slice that splits a character in half all make sense.
A Go map stores values under keys and finds them by hashing. Learn why a missing key gives the zero value, why writing to a nil map panics, and why the iteration order changes from run to run.
A Go slice is a small window onto an array that holds the real values. Once you can see the window, len, cap, append and the bug where two slices change each other stop being mysterious.
Go functions can return several values, carry variables around as closures, and schedule cleanup with defer. See how each works, including the order deferred calls run in and when their arguments are fixed.
Go gets by with if, one loop keyword called for, and a switch that doesn’t fall through. Learn each form, the Go 1.22 change that gives every loop iteration its own variable, and labelled break.
Every Go variable starts with a zero value, numbers never convert on their own, and constants are more flexible than variables. Learn var, :=, sized integers, overflow, iota and the Printf verbs for inspecting values.
A first Go program needs one command-line tool, a go.mod file and a package called main. Here is what go run, go build, gofmt and go vet each do, and why Go refuses to build code with an unused import.