Go 1.26: de wijzigingen die ik echt zou gebruiken
Een praktische blik op Go 1.26 voor gewone applicatiecode: new-expressies, modernizers, profiling, moduledefaults en de nieuwe garbage collector.
De meeste Go-releases vragen niet om een migratieproject. Dat is juist een kracht van de taal. Bij Go 1.26 blijven bestaande programma's normaal werken en maken enkele kleine wijzigingen dagelijks werk prettiger. Ik zou regulier upgraden, de bestaande tests draaien en vooral kijken naar functies die echte code eenvoudiger maken.
Optionele waarden hebben geen helper meer nodig
De ingebouwde functie new accepteert nu een expressie. Dat klinkt klein, maar verwijdert generieke pointer-helpers uit veel API-clients en configuratiepackages. Het helpt wanneer nil ‘niet opgegeven’ betekent en een pointer naar de nulwaarde juist ‘expliciet nul’ betekent, zoals bij JSON PATCH of gegenereerde SDK-types.
Ik gebruik dit op de grens waar een optionele waarde wordt opgebouwd. Gewone value fields verander ik niet alleen voor kortere syntax in pointers. Een pointer voegt nog steeds een extra toestand toe, dus nil moet een duidelijke betekenis houden.
type UpdateUser struct {
DisplayName *string `json:"display_name,omitempty"`
LoginCount *int `json:"login_count,omitempty"`
}
payload := UpdateUser{
DisplayName: new(strings.TrimSpace(input.Name)),
LoginCount: new(0), // explicitly reset, rather than omit
}go fix is weer nuttig wanneer de diff klein blijft
Go 1.26 bouwt go fix opnieuw op het analyseframework van go vet en voegt modernizers toe. Die kunnen oudere idiomen en standaard-library-calls bijwerken zonder gedrag te veranderen. Daarmee is het een nuttige onderhoudstool, maar niet iets dat ik blind over een volledige repository draai.
Ik begin op een schone branch, draai tests, voer go fix uit op een klein package en review de echte diff. Mechanische wijzigingen krijgen een eigen pull request. Wanneer een modernisering de code voor het team minder duidelijk maakt, hoef ik die niet te accepteren.
go test ./...
go fix ./internal/billing/...
git diff --stat
git diff
go test ./...De runtimeverbetering hoort vooral onopvallend te zijn
Green Tea, de garbage collector die in Go 1.25 als preview beschikbaar was, staat nu standaard aan. De grootste winst zit volgens de release notes in programma’s die veel kleine objecten scannen. Niet iedere service merkt dus hetzelfde. Voor een normale applicatie zijn bestaande loadtests, foutmonitoring en een gefaseerde release voldoende.
Er is tijdelijk een nogreenteagc-opt-out voor onverwacht gedrag, maar die verdwijnt naar verwachting in 1.27. Ik zie dat als korte diagnostische uitweg en niet als tuningadvies. Bewaar bewijs en meld problemen upstream in plaats van permanent een onzichtbare runtime-switch mee te dragen.
Kleine toolingwijzigingen zijn goed om vooraf te kennen
Nieuwe modules die met Go 1.26 worden gemaakt krijgen standaard go 1.25.0 in go.mod. Dat stimuleert compatibiliteit met ondersteunde Go-versies. Wanneer een project echt een 1.26-feature nodig heeft, stel ik die versie bewust in.
De pprof-webinterface opent nu met een flame graph en de oude graph view blijft via het menu beschikbaar. go tool doc is verwijderd ten gunste van go doc. Het zijn geen grote migratieproblemen, maar ze verklaren wel waarom een bekend commando of scherm anders werkt.
Een bewust klein upgradeplan
Ik update de lokale toolchain en CI-image, controleer go.mod en go.sum, draai tests plus go vet en bouw de applicatie-image opnieuw. Services verdienen hun normale staging- en productierollout, zeker met cgo of bijzondere runtime-instellingen, maar dat is gewone releasehygiëne.
Pas wanneer de toolchain stabiel is, gebruik ik nieuwe syntax of modernizers. Gescheiden diffs maken rollback duidelijk en laten reviewers codewijzigingen op zichzelf beoordelen. Voor de meeste teams is 1.26 één kleine infrastructuurwijziging met enkele optionele verbeteringen.
Praktische checklist
- Update lokale en CI-toolchains tegelijk
- Draai tests en go vet vóór applicatiewijzigingen
- Controleer de go-directive in nieuwe modules
- Gebruik new(expr) alleen wanneer nil echt betekenis heeft
- Review go fix in kleine diffs
- Rol services uit via het normale gefaseerde proces
