Go 1.26 āļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ: Green Tea GC, go fix āđāļĨāļ°āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ Stack āļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļē
āđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Go 1.26 āļāļĢāļāļāļāļĨāļļāļĄ Green Tea garbage collector āļĨāļ overhead 10-40%, āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go fix āļāļĢāđāļāļĄ modernizers, āļāļēāļĢāļāļąāļāļŠāļĢāļĢ slice āļāļ stack, āļāļĢāļ§āļāļāļąāļ goroutine leak āđāļĨāļ°āļĢāļ°āļāļāļĢāļąāļāļĐāļēāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ post-quantum āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļĨāļ°āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ

Go 1.26 āļāļķāđāļāđāļāļīāļāļāļąāļ§āđāļāđāļāļ·āļāļāļāļļāļĄāļ āļēāļāļąāļāļāđ 2026 āđāļāđāļāļģāđāļŠāļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļĢāļ°āļāļąāļ runtime āļāļĩāđāļŠāļģāļāļąāļāļāļĩāđāļŠāļļāļāđāļāļĢāļāļāļŦāļĨāļēāļĒāļāļĩ āļāļĢāļ°āļāļāļāļāđāļ§āļĒ Green Tea garbage collector āļāļĩāđāļāļĨāļēāļĒāđāļāđāļ GC āļāļąāļ§āļĄāļēāļāļĢāļāļēāļ āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go fix āļāļĩāđāļāļđāļāđāļāļĩāļĒāļāļāļķāđāļāđāļŦāļĄāđāļāļąāđāļāļŦāļĄāļāđāļāļ·āđāļāļĢāļāļāļĢāļąāļ modernizers āđāļĨāļ°āļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāļāļēāļĢāļāļąāļāļŠāļĢāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļ stack āļŠāļģāļŦāļĢāļąāļ slice backing store āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļŦāļĨāđāļēāļāļĩāđāļŠāđāļāļāļĨāđāļāļĒāļāļĢāļāļāđāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļāļāđāļāļĢāđāļāļĢāļĄ Go āļāļļāļāļāļąāļ§ āđāļāļĒāđāļĄāđāļāļģāđāļāđāļāļāđāļāļāđāļāđāđāļāđāļāđāļāđāļĄāđāđāļāđāļāļĢāļĢāļāļąāļāđāļāļĩāļĒāļ§ āļŠāļģāļŦāļĢāļąāļāļāļđāđāļāļĩāđāļāļģāļĨāļąāļāđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđāļāļģāđāļŦāļāđāļ Go developer āļāļēāļĢāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāļāļĩāđāļāļāļĢāđāđāļŦāļĨāđāļēāļāļĩāđāļāļĒāđāļēāļāļāđāļāļāđāļāđāļāļ°āļāđāļ§āļĒāļŠāļĢāđāļēāļāļāļ§āļēāļĄāđāļāļāļāđāļēāļāļāļēāļāļāļđāđāļŠāļĄāļąāļāļĢāļāļāļāļ·āđāļāđāļāđāļāļĒāđāļēāļāļāļąāļāđāļāļ
āļŠāļēāļĄāļāļĩāđāļāļāļĢāđāļŠāļģāļāļąāļāļāļĩāđāļĄāļąāļāļāļđāļāļāļēāļĄāđāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ: Green Tea GC (āļĨāļ GC overhead 10-40%), āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go fix āđāļ§āļāļĢāđāļāļąāļāđāļŦāļĄāđāļāļĢāđāļāļĄ modernizers āđāļĨāļ° slice backing store āļāļĩāđāļāļąāļāļŠāļĢāļĢāļāļ stack āļāļĩāđāļāļāļĢāđāļāļąāđāļāļŠāļēāļĄāđāļŦāđāļāļĢāļ°āđāļĒāļāļāđāļāđāļēāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļąāļāļāļĩāđāļāļĒāđāļĄāđāļāđāļāļāđāļāđāđāļāđāļāđāļāđāļāļīāļĄ
Green Tea Garbage Collector āļāļ·āļāļāļ°āđāļĢ āđāļĨāļ°āļāļģāļāļēāļāļāļĒāđāļēāļāđāļĢ
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: Green Tea āļāļ·āļ garbage collector āļāļąāļ§āđāļŦāļĄāđāļāļĩāđāđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāđāļ Go 1.26 āļāļķāđāļāļĄāļēāđāļāļāļāļĩāđāļāļĨāļĒāļļāļāļāđāļāļēāļĢāļŠāđāļāļāđāļāļāđāļāļīāļĄāļāļāļ tri-color concurrent collector āđāļāļāļāļĩāđāļāļ°āļāļīāļāļāļēāļĄ pointer āļāļāļāđāļāđāļĨāļ° object āļāļĩāđāļāļĢāļ°āļāļąāļāļāļĢāļ°āļāļēāļĒāļāļĒāļđāđāļāļąāđāļ§ heap (pointer-chasing) Green Tea āļāļ°āļāļģāļāļēāļĢāļŠāđāļāļāļŦāļāđāļēāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļāļēāļ 8 KiB āđāļāļāļāđāļāđāļāļ·āđāļāļ āļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļēāļāļķāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļ sequential āļāļĩāđāļāđāļ§āļĒāđāļŦāđ CPU prefetcher āļāļģāļāļēāļāđāļāđāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āļŠāđāļāļāļĨāđāļŦāđ GC overhead āļĨāļāļĨāļ 10-40% āđāļāđāļāļĢāđāļāļĢāļĄāļāļĢāļīāļ
āļŠāļģāļŦāļĢāļąāļ CPU āļĢāļļāđāļāđāļŦāļĄāđ (Intel Ice Lake āļŦāļĢāļ·āļ AMD Zen 4 āļāļķāđāļāđāļ) GC āļāļ°āđāļāđ SIMD vector instructions āđāļāļāļēāļĢāļŠāđāļāļ object āļāļāļēāļāđāļĨāđāļ āļāļķāđāļāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāđāļāļĩāļāļāļĢāļ°āļĄāļēāļ 10%
āļāļģāļāļēāļĄāđāļāļēāļ°āļĨāļķāļ: Green Tea āļāļĢāļąāļāļāļĢāļļāļāļāļĪāļāļīāļāļĢāļĢāļĄ CPU cache āļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļāļģ garbage collection āļāļĒāđāļēāļāđāļĢ
GC āļāļąāļ§āđāļāļīāļĄāļāļ°āļāļīāļāļāļēāļĄ pointer āļāļāļ object āļāđāļēāļĄāđāļāļĄāļēāļāļąāđāļ§ heap āļāļģāđāļŦāđāđāļāļīāļ cache miss āļāđāļāļĒāļāļĢāļąāđāļ āđāļāļāļāļ°āļāļĩāđ Green Tea āļāļĢāļ°āļĄāļ§āļĨāļāļĨ object āļāļĩāļĨāļ°āļŦāļāđāļēāđāļāļāļĨāđāļāļāļāļāļēāļ 8 KiB āļāļĩāđāļāđāļāđāļāļ·āđāļāļāļāļąāļ CPU prefetcher āļŠāļēāļĄāļēāļĢāļāļāļēāļāļāļēāļĢāļāđāļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļēāļāļķāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļ sequential āđāļāđ āļāļķāļāļāđāļ§āļĒāđāļŦāđ L1/L2 cache āļāļģāļāļēāļāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļ memory locality āļāļĩāđāđāļāđāļāļāļąāļāļāļąāļĒāļŦāļĨāļąāļāļāļĩāđāļāļģāđāļŦāđ overhead āļĨāļāļĨāļ 10-40%
// Previous approach: follow pointers across heap
func scanObject(obj *mspan) {
for _, ptr := range obj.pointers {
markReachable(ptr) // cache miss likely
}
}
// Green Tea approach: scan contiguous pages
func scanPage(page *pageBlock) {
// Sequential 8 KiB scan - CPU prefetcher friendly
for offset := 0; offset < pageSize; offset += objSize {
scanSlot(page.base + offset) // cache hit likely
}
}āļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļēāļĢāđāļāđāļāļēāļ Green Tea āđāļāđāđāļāļĒāļāļēāļĢāļāļąāđāļāļāđāļē GOEXPERIMENT=nogreenteagc āđāļāļāļąāđāļāļāļāļ build āđāļāđāļāļąāļ§āđāļĨāļ·āļāļāļāļĩāđāļĄāļĩāđāļāļ§āđāļāđāļĄāļāļ°āļāļđāļāđāļāļēāļāļāļāđāļ Go 1.27
āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ Stack Allocation āļŠāļģāļŦāļĢāļąāļ Slice
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: Go 1.26 āļāļĒāļēāļĒāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļāļāļ stack allocation āđāļŦāđāļāļĢāļāļāļāļĨāļļāļĄ slice backing store āđāļāļāļĢāļāļĩāļāļĩāđāļĄāļĩāļāļēāļĢāļŠāļ°āļŠāļĄāļāđāļāļĄāļđāļĨāļāđāļ§āļĒ append āļāđāļāļāļŦāļāđāļēāļāļĩāđ āļāļēāļĢāđāļĢāļĩāļĒāļ append āļāļĢāļąāđāļāđāļĢāļāļāļ°āļāļąāļāļŠāļĢāļĢ slice āļāļāļēāļ 1 āļāļ heap āļāļēāļāļāļąāđāļāļāļĒāļēāļĒāđāļāđāļ 2, 4, 8 āļāļēāļĄāļĨāļģāļāļąāļ (āļāļēāļĢāļāļĒāļēāļĒāđāļāļ doubling āļĄāļēāļāļĢāļāļēāļ) āđāļ Go 1.26 compiler āļāļ°āļāļąāļāļŠāļĢāļĢ buffer āļāļāļēāļāđāļĨāđāļāļāļ stack āļāđāļāļāđāļāđāļēāļŠāļđāđāļĨāļđāļ āļāļģāđāļŦāđāļāļēāļĢ append āđāļāļĢāļāļāđāļĢāļāđ āđāļāđ stack buffer āđāļāļĒāđāļĄāđāļāđāļāļāļāļąāļāļŠāļĢāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļ heap āđāļĨāļĒ
func collectTasks(items []Item) []Task {
var tasks []Task
// Before Go 1.26: first append allocates on heap (size 1, 2, 4...)
// Go 1.26: compiler inserts a stack-backed buffer
for _, item := range items {
if item.IsReady() {
tasks = append(tasks, item.ToTask())
// First ~4 appends use stack buffer, zero heap allocations
}
}
return tasks
// If slice escapes, runtime.move2heap() copies once at return
}āļāļģāļāļēāļĄāđāļāļēāļ°āļĨāļķāļ: āđāļāļīāļāļāļ°āđāļĢāļāļķāđāļāđāļĄāļ·āđāļ slice āļŦāļĨāļļāļāļāļāļāļāļēāļ scope āļāļāļāļāļąāļāļāđāļāļąāļ
āđāļĄāđāļ§āđāļē slice āļāļ°āļāđāļāļāļŦāļĨāļļāļāđāļāļĒāļąāļ heap (āđāļāļ·āđāļāļāļāļēāļāļāļąāļāļāđāļāļąāļ return āļāđāļē slice āļāļāļāđāļ) Go 1.26 āļĒāļąāļāļāļāđāļāđ stack buffer āļĢāļ°āļŦāļ§āđāļēāļāļāļąāđāļāļāļāļāļāļēāļĢāļŠāļ°āļŠāļĄāļāđāļāļĄāļđāļĨ compiler āļāļ°āđāļāļĢāļāļāļēāļĢāđāļĢāļĩāļĒāļ runtime.move2heap() āđāļāļ·āđāļāļāļąāļāļĨāļāļāļāđāļāļĄāļđāļĨāļŠāļļāļāļāđāļēāļĒāđāļāļĒāļąāļ heap āđāļāļĩāļĒāļāļāļĢāļąāđāļāđāļāļĩāļĒāļ§āļāļĩāđāļāļļāļ return āđāļāļāļāļĩāđāļāļ°āļĄāļĩ heap allocation 3 āļāļĢāļąāđāļāļāļķāđāļāđāļāđāļāļāđāļ§āļāđāļĢāļīāđāļĄāļāđāļ (āļāļāļēāļ 1, 2, 4...) āļāļ°āđāļŦāļĨāļ·āļ heap allocation āđāļāļĩāļĒāļāļāļĢāļąāđāļāđāļāļĩāļĒāļ§āļāļĩāđāļāļāļāļāļ āļ§āļīāļāļĩāļāļĩāđāđāļāļŦāļĨāļēāļĒāļāļĢāļāļĩāđāļŦāđāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļĩāļāļ§āđāļēāļāļēāļĢ pre-allocate āļāđāļ§āļĒāļāļāđāļāļ āđāļāļ·āđāļāļāļāļēāļāļāļēāļĢāļāļąāļāļĨāļāļāđāļāļīāļāļāļķāđāļāļāđāļāđāļāđāļĄāļ·āđāļāļāđāļāļĄāļđāļĨāļāļĒāļđāđāļāļ stack āđāļāđāļēāļāļąāđāļāļāļāļāļķāļāļāļļāļ return
āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go fix āđāļ§āļāļĢāđāļāļąāļāđāļŦāļĄāđ āļāļĢāđāļāļĄ Modernizers
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go fix āļāļđāļāđāļāļĩāļĒāļāļāļķāđāļāđāļŦāļĄāđāļāļąāđāļāļŦāļĄāļāđāļŦāđāđāļāđāļāļĻāļđāļāļĒāđāļāļĨāļēāļāļāļāļ Go modernizers āđāļāļĒāļĄāļĩāļāļļāļāļāļĢāļ°āļŠāļāļāđāđāļāļ·āđāļāļāđāļ§āļĒāļāļąāļāđāļāļ codebase āđāļŦāđāđāļāđ idiom āđāļĨāļ° standard library API āļĢāļļāđāļāļĨāđāļēāļŠāļļāļ āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go fix āļāļąāļ§āđāļŦāļĄāđāļāļĩāđāđāļāđ analysis framework āđāļāļĩāļĒāļ§āļāļąāļāļāļąāļ go vet āļāļģāđāļŦāđ analyzer āļāļąāļ§āđāļāļĩāļĒāļ§āļāļąāļāļāļĩāđāđāļŦāđ diagnostic āļŠāļēāļĄāļēāļĢāļāđāļāļ°āļāļģāđāļĨāļ°āļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļāļēāļĢāđāļāđāđāļāđāļāđāļāđāļ§āļĒ
āļāļļāļāļŠāļĄāļāļąāļāļīāļŦāļĨāļąāļāļāļāļ go fix āļāļąāļ§āđāļŦāļĄāđ āđāļāđāđāļāđ
- fixer āļŦāļĨāļēāļĒāļŠāļīāļāļāļąāļ§āļŠāļģāļŦāļĢāļąāļ idiom āđāļĨāļ° API āļŠāļĄāļąāļĒāđāļŦāļĄāđāļāļāļ Go
- source-level inliner āļāļĩāđāđāļāļīāļāđāļāđāļāļēāļāļāđāļēāļ directive
//go:fix inline - āļĢāļąāļāļāļĢāļ°āļāļąāļāļ§āđāļēāļāļ°āđāļĄāđāđāļāļĨāļĩāđāļĒāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļāļāđāļāđāļ (āļāļĨāļāļāļ āļąāļĒāļŠāļģāļŦāļĢāļąāļ production code)
- fixer āļāļąāļ§āđāļāđāļēāļāļĩāđāļĨāđāļēāļŠāļĄāļąāļĒāļāļđāļāđāļāļēāļāļāļāđāļĨāđāļ§
# Apply all modernizers to the current module
go fix ./...
# The tool automatically updates patterns like:
# - Old-style error wrapping to fmt.Errorf with %w
# - Deprecated API calls to their replacements
# - Legacy patterns to modern Go idiomsāļāļģāļāļēāļĄāđāļāļēāļ°āļĨāļķāļ: //go:fix inline āļāļģāļāļēāļāļāļĒāđāļēāļāđāļĢ
directive //go:fix inline āļāļģāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļāļąāļāļāđāļāļąāļāļŦāļĢāļ·āļ method āļ§āđāļēāđāļāđāļāļāļąāļ§āđāļĨāļ·āļāļāļŠāļģāļŦāļĢāļąāļ source-level inlining āđāļāļĒ go fix āđāļĄāļ·āđāļāļĢāļąāļāļāļģāļŠāļąāđāļ go fix āļĢāļ°āļāļāļāļ°āđāļāļāļāļĩāđāļāļļāļāđāļĢāļĩāļĒāļāđāļāđāļāļąāļāļāđāļāļąāļāļāļĩāđāļāļđāļāļāļģāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāđāļ§āđāļāđāļ§āļĒāđāļāļ·āđāļāļŦāļēāļāļāļāļāļąāļāļāđāļāļąāļāļāļąāđāļ āļŠāļīāđāļāļāļĩāđāđāļāļāļāđāļēāļāļāļēāļ compiler inlining āļāļĢāļāļāļĩāđāđāļāđāļāļāļēāļĢāđāļāļĨāļāļāļāļĢāđāļŠāđāļāđāļ āđāļĄāđāđāļāđ machine code āļāļđāđāđāļāļĩāļĒāļāđāļĨāļāļĢāļēāļĢāļĩāļŠāļēāļĄāļēāļĢāļāđāļāđāļ§āļīāļāļĩāļāļĩāđāđāļāļ·āđāļ deprecate wrapper function āđāļāļĒāļāļēāļĢ inline āđāļāļĒāļąāļ modern equivalent āļāļĩāđāļāļļāļāđāļĢāļĩāļĒāļāđāļāđ
āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ cgo āļāļĩāļāļķāđāļāļāļĢāļ°āļĄāļēāļ 30%
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: Go 1.26 āļĨāļ overhead āļāļ·āđāļāļāļēāļāļāļāļāļāļļāļāļāļēāļĢāđāļĢāļĩāļĒāļ cgo āļĨāļāļāļĢāļ°āļĄāļēāļ 30% runtime āļāļģāđāļāđāđāļāļĒāļāļēāļĢāļāļģāļāļąāļ processor state _Psyscall āļāļķāđāļāđāļāđāļ intermediate state āļāļĩāđ goroutine āļāđāļāļāļāđāļēāļāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāđāļĢāļĩāļĒāļ cgo āļāļēāļĢāđāļāļē transition state āļāļĩāđāļāļāļāļāđāļ§āļĒāļĨāļāļāļģāļāļ§āļ state transition āđāļāđāļāđāļĨāļ°āļāļēāļĢāđāļĢāļĩāļĒāļ cgo āļāļķāđāļāļĨāļ latency āļĨāļāđāļāļĒāļāļĢāļ
āļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāļāļĩāđāļĄāļĩāļāļ§āļēāļĄāļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļāļĩāđāđāļĢāļĩāļĒāļ cgo āļāđāļāļĒāļāļĢāļąāđāļ āđāļāđāļ āđāļāļĢāđāļāļĢāļĄāļāļĩāđāđāļāđ C library āļŠāļģāļŦāļĢāļąāļ database driver, image processing āļŦāļĢāļ·āļ cryptographic operations āđāļāļĒāđāļĄāđāļāđāļāļāđāļāđāđāļāđāļāđāļāđāļāđ
āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļĢāļ°āļāļąāļāļ āļēāļĐāļē: new() āđāļĨāļ° Self-Referential Generics
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: Go 1.26 āļāļģāđāļŠāļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļĢāļ°āļāļąāļāļ āļēāļĐāļēāļŠāļāļāļāļĢāļ°āļāļēāļĢ
1. āļāļąāļāļāđāļāļąāļ new() āļāļĩāđāļāļĢāļąāļāļāļĢāļļāļāđāļĨāđāļ§: āļāļąāļāļāđāļāļąāļ built-in new āļĢāļąāļ expression āđāļāđāļ operand āđāļāđāđāļĨāđāļ§ āđāļāļ·āđāļāļāļģāļŦāļāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļāļāļāļąāļ§āđāļāļĢ āļāđāļāļāļŦāļāđāļēāļāļĩāđ new(T) āļāļ° return *T āļāļĩāđāļĄāļĩāļāđāļēāđāļāđāļ zero value āđāļŠāļĄāļ
type Config struct {
Timeout *int
MaxRetry *int
}
// Before Go 1.26: helper function needed
func intPtr(v int) *int { return &v }
func makeConfig() Config {
return Config{
Timeout: intPtr(30),
MaxRetry: intPtr(3),
}
}
// Go 1.26: direct initialization
func makeConfig() Config {
return Config{
Timeout: new(30), // *int pointing to 30
MaxRetry: new(3), // *int pointing to 3
}
}2. Generic type āļāļĩāđāļāđāļēāļāļāļīāļāļāļąāļ§āđāļāļ: generic type āļŠāļēāļĄāļēāļĢāļāļāđāļēāļāļāļīāļāļāļķāļāļāļąāļ§āđāļāļāđāļ type parameter constraint āđāļāđāđāļĨāđāļ§ āļāļķāđāļāđāļāļīāļāļāļēāļāđāļŦāđāđāļāđ pattern āļāļąāđāļāļŠāļđāļāļāļĒāđāļēāļ F-bounded polymorphism
type Adder[A Adder[A]] interface {
Add(A) A
}
type Vector2D struct{ X, Y float64 }
func (v Vector2D) Add(other Vector2D) Vector2D {
return Vector2D{v.X + other.X, v.Y + other.Y}
}
// The constraint ensures the return type matches the receiver type
func Sum[A Adder[A]](items []A) A {
var result A
for _, item := range items {
result = result.Add(item)
}
return result
}āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Go āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļāļēāļĢāļāļĢāļ§āļāļāļąāļ Goroutine Leak
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: Go 1.26 āđāļāļīāđāļĄ profile type āđāļŦāļĄāđāđāļāļāļāļāļĨāļāļāļāļ·āđāļ goroutineleak āđāļ runtime/pprof goroutine āļāļĩāđ leak āļāļ·āļ goroutine āļāļĩāđāļāļđāļ block āļāļĒāļđāđāļāļĩāđ concurrency primitive (channel, sync.Mutex, sync.Cond) āđāļĨāļ°āđāļĄāđāļĄāļĩāļāļēāļāļāļđāļ unblock āđāļāđāļāļĩāļ runtime āļāļĢāļ§āļāļāļąāļāļŠāļāļēāļāļāļēāļĢāļāđāđāļŦāļĨāđāļēāļāļĩāđāđāļāļĒāđāļāđ garbage collector āļāļĨāđāļēāļ§āļāļ·āļ āļāđāļē goroutine G āļāļđāļ block āļāļĒāļđāđāļāļĩāđ primitive P āđāļĨāļ° P āđāļĄāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāđāļāđāļāļēāļ goroutine āđāļāđ āļāļĩāđāļĒāļąāļāļāļģāļāļēāļāļāļĒāļđāđ āđāļŠāļāļāļ§āđāļē G āļāļ°āđāļĄāđāļĄāļĩāļ§āļąāļ wake up āđāļāđ
func processWorkItems(ws []workItem) ([]workResult, error) {
ch := make(chan result)
for _, w := range ws {
go func() {
res, err := processWorkItem(w)
ch <- result{res, err} // goroutine blocks here if early return
}()
}
for range len(ws) {
r := <-ch
if r.err != nil {
return nil, r.err // remaining goroutines leak
}
}
return results, nil
}
// Enable detection: GOEXPERIMENT=goroutineleakprofile
// Endpoint: /debug/pprof/goroutineleakāļāļēāļĢāļāļĢāļ§āļāļāļąāļāļāļĩāđāđāļāđ reachability analysis āļāļāļ GC āļāļķāļāļŠāļēāļĄāļēāļĢāļāļāļąāļ leak āđāļāđāļŦāļĨāļēāļĒāļāļĢāļ°āđāļ āļāđāļāļĒāđāļĄāđāļāđāļāļāđāļāļīāđāļĄ instrumentation āļāđāļ§āļĒāļāļāđāļāļ āļāļĩāđāļāļāļĢāđāļāļĩāđāļāļēāļāļ§āđāļēāļāļ°āđāļāļīāļāđāļāđāļāļēāļāđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāđāļ Go 1.27
āļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ: Heap Randomization āđāļĨāļ° Post-Quantum Crypto
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: Go 1.26 āļĄāļĩāļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļĩāđāļŠāļģāļāļąāļāļŠāļāļāļāļĢāļ°āļāļēāļĢ
Heap base address randomization (āđāļāļĨāļāļāļāļĢāđāļĄ 64-bit): runtime āļāļ°āļāļģāļāļēāļĢ randomize heap base address āđāļĄāļ·āđāļāđāļĢāļīāđāļĄāļāđāļāđāļāļĢāđāļāļĢāļĄ āļāļģāđāļŦāđāļāļđāđāđāļāļĄāļāļĩāļāļēāļāđāļāļēāļāļģāđāļŦāļāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāđāļĒāļēāļāļāļķāđāļāđāļāļāļĢāļāļĩāļāļĩāđāļĄāļĩāļāđāļāļāđāļŦāļ§āđāļāđāļēāļ cgo āļāļĩāđāļāļ·āļāļāļēāļĢāļāđāļāļāļāļąāļāđāļāļ ASLR āļŠāļģāļŦāļĢāļąāļ heap memory āļāļāļ Go āļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļēāļĢāđāļāđāļāļēāļāđāļāđāļāđāļ§āļĒ GOEXPERIMENT=norandomizedheapbase64
Post-quantum cryptography āđāļāļīāļāđāļāđāļāļēāļāđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļ: āļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ TLS āļāļ°āđāļāđ hybrid key exchange āđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļ (SecP256r1MLKEM768, SecP384r1MLKEM1024) āļāļķāđāļāļĢāļ§āļĄ elliptic-curve cryptography āđāļāļāļāļąāđāļāđāļāļīāļĄāđāļāđāļēāļāļąāļ ML-KEM (āđāļāļīāļĄāļāļ·āđāļ CRYSTALS-Kyber) āđāļāļ·āđāļāļāļ§āļēāļĄāļāļāļāļēāļāļāđāļ quantum computing āļāļāļāļāļēāļāļāļĩāđ package crypto/mlkem āļĒāļąāļāđāļāđāļĢāļąāļāļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāđāļŦāđāđāļĢāđāļ§āļāļķāđāļāļāļĢāļ°āļĄāļēāļ 18% āđāļāļŠāđāļ§āļāļāļāļ encapsulation āđāļĨāļ° decapsulation
āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļāļ Standard Library āļāļĩāđāļāļĩāļāļķāđāļāļāļĒāđāļēāļāđāļŦāđāļāđāļāđāļāļąāļ
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: āļāļąāļāļāđāļāļąāļāļŦāļĨāļēāļĒāļāļąāļ§āđāļ standard library āđāļāđāļĢāļąāļāļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļĒāđāļēāļāļāļĢāļāļāļļāļ
| āļāļąāļāļāđāļāļąāļ | āļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļ | āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļ |
|----------|------------|--------|
| fmt.Errorf (āđāļĄāđāļĄāļĩ format verb) | āđāļĢāđāļ§āļāļķāđāļāļāļĢāļ°āļĄāļēāļ 92% | āļāļēāļĢāđāļĢāļĩāļĒāļāđāļāļāđāļĄāđāļĄāļĩ format verb āļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāļĩāļĒāļāđāļāđāļē errors.New |
| io.ReadAll | āđāļĢāđāļ§āļāļķāđāļāļāļĢāļ°āļĄāļēāļ 2 āđāļāđāļē āđāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāđāļāļĒāļĨāļ 50% | āđāļāđāļāļēāļĢāļāļĒāļēāļĒ buffer āđāļāļ exponential āđāļāļ linear |
| crypto/mlkem | āđāļĢāđāļ§āļāļķāđāļāļāļĢāļ°āļĄāļēāļ 18% | āļāļĢāļąāļāļāļĢāļļāļ encapsulation āđāļĨāļ° decapsulation |
| image/jpeg | āđāļĢāđāļ§āļāļķāđāļāđāļĨāļ°āđāļĄāđāļāļĒāļģāļāļķāđāļ | encoder/decoder āļāļĩāđāđāļāļĩāļĒāļāđāļŦāļĄāđāļāļąāđāļāļŦāļĄāļ |
āļāļāļāļāļēāļāļāļĩāđ bytes.Buffer āļĒāļąāļāđāļāļīāđāļĄ method Peek() āđāļĨāļ° errors āđāļāđāļĢāļąāļāļāļąāļāļāđāļāļąāļ generic AsType() āļŠāđāļ§āļ reflect āđāļāļīāđāļĄ iterator method (Type.Fields(), Type.Methods(), Value.Fields()) āļāļĩāđāļŠāļāļāļāļĨāđāļāļāļāļąāļ range-over-func pattern āļāļāļ Go
āļāļąāļāļāđāļāļąāļ errors.AsType āđāļāļ Generic āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢ Error
āļāļģāļāļāļāļāļĩāđāļāļēāļāļŦāļ§āļąāļ: errors.AsType[T]() āđāļāđāļāļāļēāļāđāļĨāļ·āļāļāđāļāļ generic āļāļāļ errors.As() āļāļĩāđāļāđāļ§āļĒāļĨāļ boilerplate code āđāļāļĒāđāļĄāđāļāđāļāļāļāļĢāļ°āļāļēāļĻāļāļąāļ§āđāļāļĢ target āļāđāļāļāđāļĢāļĩāļĒāļāđāļāđ As
// Before Go 1.26: two-step process
var pathErr *os.PathError
if errors.As(err, &pathErr) {
log.Printf("path error on %s: %v", pathErr.Path, pathErr.Err)
}
// Go 1.26: single expression
if pathErr, ok := errors.AsType[*os.PathError](err); ok {
log.Printf("path error on %s: %v", pathErr.Path, pathErr.Err)
}āđāļ§āļāļĢāđāļāļąāļ generic āļāļĩāđāđāļŦāđāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāđāļēāļ type āļāļąāđāļāđāļāđ compile time āđāļĨāļ°āļāđāļēāļāđāļāđāļēāđāļāļāđāļēāļĒāļāļ§āđāļēāđāļĄāļ·āđāļāđāļāđāđāļāđāļāļ·āđāļāļāđāļāđāļāļāļĨāļđāļāđāļāđ
āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Go āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļŠāļĢāļļāļ
- Green Tea GC āļŠāđāļāļāļŦāļāđāļēāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļāļēāļ 8 KiB āđāļāļāļāļēāļĢāļāļīāļāļāļēāļĄ pointer āļāļģāđāļŦāđ GC overhead āļĨāļāļĨāļ 10-40% āđāļāļĒāđāļĄāđāļāđāļāļāđāļāđāđāļāđāļāđāļāđāļĄāđāđāļāđāļāļĢāļĢāļāļąāļāđāļāļĩāļĒāļ§
- Slice backing store āļāļĩāđāļāļąāļāļŠāļĢāļĢāļāļ stack āļāđāļ§āļĒāļāļģāļāļąāļ heap allocation 3 āļāļĢāļąāđāļāļāļķāđāļāđāļāđāļāļāđāļ§āļāđāļĢāļīāđāļĄāļāđāļāļāļāļāļĨāļđāļ append āđāļāļĒāļāļąāļāļĨāļāļāđāļāļĒāļąāļ heap āđāļāļĩāļĒāļāļāļĢāļąāđāļāđāļāļĩāļĒāļ§āļāļĩāđāļāļļāļ escape
- āđāļāļĢāļ·āđāļāļāļĄāļ·āļ
go fixāđāļ§āļāļĢāđāļāļąāļāđāļŦāļĄāđāļāļĢāļ°āļĒāļļāļāļāđāđāļāđ modernizer āļŦāļĨāļēāļĒāļŠāļīāļāļāļąāļ§āļāļ analysis framework āđāļāļĩāļĒāļ§āļāļąāļāļāļąāļgo vetāđāļāļĒāļĢāļąāļāļāļĢāļ°āļāļąāļāļ§āđāļēāļāļ°āđāļĄāđāđāļāļĨāļĩāđāļĒāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļāļāđāļāđāļ new()āļĢāļąāļ expression āđāļāđāļ argument āđāļāđāđāļĨāđāļ§ āļāļģāđāļŦāđāđāļĄāđāļāđāļāļāđāļāļĩāļĒāļ helper function āļŠāļģāļŦāļĢāļąāļāļŠāļĢāđāļēāļ pointer āļāļĩāļāļāđāļāđāļ- Self-referential generic type constraint āđāļāļīāļāļāļēāļāđāļŦāđāđāļāđ F-bounded polymorphism pattern
- āļāļēāļĢāļāļĢāļ§āļāļāļąāļ goroutine leak (āđāļāļāļāļāļĨāļāļ) āđāļāđ GC reachability analysis āđāļāļ·āđāļāļāđāļāļŦāļē goroutine āļāļĩāđāļāļđāļ block āļāļēāļ§āļĢ
fmt.ErrorfāļāļĩāđāđāļĄāđāļĄāļĩ format verb āđāļĢāđāļ§āļāļķāđāļ 92% āđāļĨāļ°io.ReadAllāđāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāđāļāļĒāļĨāļ 50%- Hybrid post-quantum key exchange āđāļāļīāļāđāļāđāļāļēāļāđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ TLS āļāļļāļāļĢāļēāļĒāļāļēāļĢ
āļāļēāļĢāđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļģāļŦāļĢāļąāļāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Go āļāļ°āđāļāđāļāļĢāļ°āđāļĒāļāļāđāļāļĒāđāļēāļāļĄāļēāļāļāļēāļāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļĢāļ°āļāļąāļ runtime āđāļŦāļĨāđāļēāļāļĩāđ āļāļđāđāļĄāļ·āļ concurrency āđāļ Go āļāļĢāļāļāļāļĨāļļāļĄ goroutine pattern āļāļ·āđāļāļāļēāļāļāļĩāđāđāļŠāļĢāļīāļĄāļāļĩāđāļāļāļĢāđ leak detection āļāļĩāđāļāļĨāđāļēāļ§āļāļķāļāđāļāļāļāļāļ§āļēāļĄāļāļĩāđ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

25 āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Go āļĒāļāļāļāļīāļĒāļĄ: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļē
āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Go āļāđāļ§āļĒ 25 āļāļģāļāļēāļĄāļāļĩāđāļāļđāļāļāļēāļĄāļāđāļāļĒ goroutine, channel, interface āđāļĨāļ°āļĢāļđāļāđāļāļāļāļēāļĢāļāļģāļāļēāļāļāļĢāđāļāļĄāļāļąāļāļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

āļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļāļīāļ Go: Goroutine, Channel āđāļĨāļ° Concurrency
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļāļīāļ Go āđāļāļĩāđāļĒāļ§āļāļąāļ goroutine, channel āđāļĨāļ° concurrency pattern āļāđāļēāļāđ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāđāļāļāļīāļāļāļĨāļēāļāļāļĩāđāļāļāļāđāļāļĒ āđāļĨāļ°āļāļģāļāļāļāļĢāļ°āļāļąāļāļāļđāđāđāļāļĩāđāļĒāļ§āļāļēāļāļŠāļģāļŦāļĢāļąāļāđāļāļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļāļīāļ Go āļāļĩ 2026

āļāļēāļĢāļāļģāļāļēāļāļāļĢāđāļāļĄāļāļąāļāđāļ Go: Goroutines āđāļĨāļ° Channels - āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ
āđāļāļĩāđāļĒāļ§āļāļēāļāļāļēāļĢāļāļģāļāļēāļāļāļĢāđāļāļĄāļāļąāļāđāļ Go āļāđāļ§āļĒ goroutines āđāļĨāļ° channels āļĢāļđāļāđāļāļāļāļąāđāļāļŠāļđāļ āļāļēāļĢāļāļīāļāđāļāļĢāđāļāļāđ āļāļģāļŠāļąāđāļ select āđāļĨāļ°āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļāļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļāļĒāļĨāļ°āđāļāļĩāļĒāļ