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 Green Tea GC, go fix āđāļĨāļ°āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž Stack

Go 1.26 āļ‹āļķāđˆāļ‡āđ€āļ›āļīāļ”āļ•āļąāļ§āđƒāļ™āđ€āļ”āļ·āļ­āļ™āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2026 āđ„āļ”āđ‰āļ™āļģāđ€āļŠāļ™āļ­āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļĢāļ°āļ”āļąāļš runtime āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļĢāļ­āļšāļŦāļĨāļēāļĒāļ›āļĩ āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ Green Tea garbage collector āļ—āļĩāđˆāļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ GC āļ•āļąāļ§āļĄāļēāļ•āļĢāļāļēāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ go fix āļ—āļĩāđˆāļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļš modernizers āđāļĨāļ°āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļšāļ™ stack āļŠāļģāļŦāļĢāļąāļš slice backing store āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļŠāđˆāļ‡āļœāļĨāđ‚āļ”āļĒāļ•āļĢāļ‡āļ•āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Go āļ—āļļāļāļ•āļąāļ§ āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āđ‚āļ„āđ‰āļ”āđāļĄāđ‰āđāļ•āđˆāļšāļĢāļĢāļ—āļąāļ”āđ€āļ”āļĩāļĒāļ§ āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ•āļģāđāļŦāļ™āđˆāļ‡ Go developer āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļŸāļĩāđ€āļˆāļ­āļĢāđŒāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ­āļĒāđˆāļēāļ‡āļ–āđˆāļ­āļ‡āđāļ—āđ‰āļˆāļ°āļŠāđˆāļ§āļĒāļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļ„āļ™āļ­āļ·āđˆāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™

āļŸāļĩāđ€āļˆāļ­āļĢāđŒāļŦāļĨāļąāļāļ‚āļ­āļ‡ Go 1.26 āļ—āļĩāđˆāļ„āļ§āļĢāļĢāļđāđ‰āļāđˆāļ­āļ™āļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļŠāļēāļĄāļŸāļĩāđ€āļˆāļ­āļĢāđŒāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļĄāļąāļāļ–āļđāļāļ–āļēāļĄāđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ: 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%

runtime/mgcmark.go (simplified concept)go
// 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 āđ€āļĨāļĒ

tasks.gogo
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 āļ•āļąāļ§āđ€āļāđˆāļēāļ—āļĩāđˆāļĨāđ‰āļēāļŠāļĄāļąāļĒāļ–āļđāļāđ€āļ­āļēāļ­āļ­āļāđāļĨāđ‰āļ§
bash
# 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 āđ€āļŠāļĄāļ­

person.gogo
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

algebra.gogo
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 āđ„āļ”āđ‰

leaky_server.gogo
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

handler.gogo
// 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 āļ—āļĩāđˆāļāļĨāđˆāļēāļ§āļ–āļķāļ‡āđƒāļ™āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āđāļ—āđ‡āļ

#go
#interview
#garbage-collector
#performance

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go - āļ„āļđāđˆāļĄāļ·āļ­āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ

25 āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go āļĒāļ­āļ”āļ™āļīāļĒāļĄ: āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē

āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go āļ”āđ‰āļ§āļĒ 25 āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļ–āļēāļĄāļšāđˆāļ­āļĒ goroutine, channel, interface āđāļĨāļ°āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”

āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ goroutine channel āđāļĨāļ° concurrency pattern

āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go: Goroutine, Channel āđāļĨāļ° Concurrency

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš goroutine, channel āđāļĨāļ° concurrency pattern āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ” āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ āđāļĨāļ°āļ„āļģāļ•āļ­āļšāļĢāļ°āļ”āļąāļšāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļŠāļģāļŦāļĢāļąāļšāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go āļ›āļĩ 2026

āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ‚āļ­āļ‡ Go - Goroutines āđāļĨāļ° channels āđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™

āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™ Go: Goroutines āđāļĨāļ° Channels - āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ

āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™ Go āļ”āđ‰āļ§āļĒ goroutines āđāļĨāļ° channels āļĢāļđāļ›āđāļšāļšāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āļāļēāļĢāļ‹āļīāļ‡āđ‚āļ„āļĢāđ„āļ™āļ‹āđŒ āļ„āļģāļŠāļąāđˆāļ‡ select āđāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”