August 16, 2021
Go 1.17 adds small language features (slice-to-array-pointer conversion, unsafe.Add/Slice), a register-based calling convention that speeds up compiled code (~5%) and shrinks binaries on amd64, and module graph pruning for go.mod. It also tightens defaults in net/url, net/http, and crypto/tls — some of which are behavior-changing and worth checking before upgrading.
New conversion of slice to array pointer ([]T to *[N]T), which can panic at runtime if len(s) < N — the first type conversion able to panic
New unsafe.Add and unsafe.Slice functions for pointer arithmetic and building slices from pointers, per unsafe.Pointer safety rules
Compiler now passes function arguments/results in registers on linux/amd64, darwin/amd64, windows/amd64: ~5% faster, ~2% smaller binaries; can affect code depending on function pointer identity or violating unsafe.Pointer rules
Module graph pruning for go.mod files declaring go 1.17+: go.mod now explicitly lists all transitively-imported dependencies, and go commands avoid downloading unneeded go.mod files (lazy loading)
go mod tidy gains -go flag to set/upgrade the go.mod go version, and -compat flag to control backward-compatibility checks
net/url and net/http no longer accept semicolons as query separators by default (security fix); AllowQuerySemicolons wrapper restores old behavior
crypto/tls: cipher suite ordering is now decided entirely by the package (Config.CipherSuites order and PreferServerCipherSuites ignored); strict ALPN enforcement on servers; new Conn.HandshakeContext method
New windows/arm64 port with cgo support; openbsd/386 and openbsd/arm now also make syscalls via libc for OpenBSD 6.9+ compatibility
go vet adds checks for unsynchronized //go:build vs // +build lines, unbuffered channels passed to signal.Notify, and mismatched Is/As/Unwrap method signatures for errors package use
go get -insecure flag removed (use GOINSECURE/GONOSUMDB instead); go get now warns when installing commands outside the main module, foreshadowing go install cmd@version as the preferred path
crypto/ed25519 rewritten (~2x faster) and crypto/elliptic P521 rewritten as constant-time and ~3x faster, with no behavior changes
gofmt now automatically synchronizes //go:build lines with legacy // +build lines as part of the migration to the new build-tag syntax