# Go 1 23

> Apply Go 1.23 language features, tooling, standard-library APIs, migrations, and behaviour changes. Load for Go work targeting 1.23 or later when the model's knowledge may predate the 2024-08-13 release.

- Skill: `cedws/go-1-23` (Agent Skill)
- Install (CLI): `npx skillmds@latest add cedws/go-1-23`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cedws/go-1-23/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: cedws (https://skillmd.com/u/cedws)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cedws/go-1-23

---


# Go 1.23

This overview applies when the project's target Go version is at least 1.23.

## Language

- **Available capability:** range-over-function iterators for pull-free sequence APIs whose shape is `func(func() bool)`, `func(func(K) bool)`, or `func(func(K, V) bool)`. Stop producing values when the yield function returns false.
- `GOEXPERIMENT=aliastypeparams` is an experimental opt-in for evaluate generic type aliases within one package. Do not design cross-package APIs around them in Go 1.23.

## Tools

- **Available capability:** `go mod tidy -diff` in checks that must report required module-file changes without modifying files.
- `go env -changed` can inspect only environment settings that differ from Go's defaults.
- `go vet` can detect standard-library symbols newer than the effective Go version declared by `go.mod` or file build constraints.
- uploaded toolchain telemetry is opt-in. Use `go telemetry local` to retain counters locally or `go telemetry on` only with an explicit project or user decision.
- **Unsupported or discouraged:** add new `//go:linkname` references to unmarked standard-library internals. Use `-checklinkname=0` only for debugging or experiments.

## Iterators and canonical values

- Define iterator APIs with `iter.Seq` or `iter.Seq2`, and consume them directly with `range`.
- **Modern alternative:** the iterator operations in `slices` and `maps` when they avoid intermediate collections. Use `Collect`, `Sorted`, or `maps.Collect` when a materialised result is actually needed.
- `unique.Make` is available when many equal comparable values should share canonical storage and fast handle equality is useful.
- Embed `structs.HostLayout` in structures passed to or accessed by pointer from host APIs when host-compatible field layout is required.

## Timers and runtime diagnostics

- Rely on unreachable timers and tickers being garbage-collected without calling `Stop` solely for reclamation.
- timer channels is unbuffered. After `Timer.Stop` or `Timer.Reset`, rely on the guarantee that stale values prepared earlier will not be delivered. Replace `len(t.C)` polling with a non-blocking receive.
- **Available capability:** `GODEBUG=asynctimerchan=1` only as temporary migration support for code requiring the older buffered timer behaviour.
- `runtime/debug.SetCrashOutput` can direct fatal runtime reports to an automated crash collector.
- **Available capability:** runtime traces during crash investigation; Go 1.23 flushes trace data on uncaught panic and the trace tool recovers useful data from partially broken traces.

## Standard library

- `path/filepath.Localize` can convert a valid slash-separated path safely to the operating system's path form.
- `net.KeepAliveConfig` is available when TCP keep-alive timing needs explicit control on dialled or accepted connections.
- Inspect cancellation and deadline causes from `net.DNSError` with `errors.Is`.
- **Available capability:** `http.Request.CookiesNamed`, `http.ParseCookie`, and `http.ParseSetCookie` when duplicate cookie names or strict parsing matter.
- Account for `ServeContent`, `ServeFile`, and `ServeFileFS` removing representation headers from error responses. Use `GODEBUG=httpservecontentkeepheaders=1` only while migrating middleware that depended on the old behaviour.
- **Available capability:** `reflect.Value.Seq` or `Seq2` only after `Type.CanSeq` or `CanSeq2` when the dynamic type is not already known.
- `sync.Map.Clear` can empty a concurrent map rather than ranging and deleting entries individually.

## TLS compatibility

- 3DES is absent from default cipher suites, while the experimental post-quantum X25519Kyber768Draft00 exchange is enabled by default. `Config.CipherSuites` and `Config.CurvePreferences` can express different interoperability requirements.
- `tls.X509KeyPair` and `tls.LoadX509KeyPair` populate `Certificate.Leaf`.
- **Migration note:** certificates using SHA-1 signatures; Go 1.24 removes the temporary verification escape hatch announced in this release.

## Platform compatibility

- **Platform requirement:** macOS 11 or later.
- **Compatibility outlook:** Linux deployments for a minimum kernel of 3.2 before moving to Go 1.24.
- **Configuration:** `GOARM64` when binaries require a specific minimum ARM64 architecture or the LSE or cryptographic extensions; otherwise retain the portable `v8.0` default.

