Goroutines are lightweight user-space threads managed by the Go runtime, starting at ~2KB of stack and multiplexed onto a small pool of OS threads through the M:N scheduler.
OS thread stack: 1-8MB fixed. Goroutine stack: starts at 2KB, grows and shrinks dynamically up to 1GB
Context switch: OS thread switch requires kernel mode transition (~1μs). Goroutine switch is in user space (~100ns)
Creation cost: spawning an OS thread takes ~10-100μs. Launching a goroutine takes ~1μs
Scheduling: OS scheduler is preemptive and unaware of Go semantics. Go scheduler is cooperative with preemption at safe points
Scale: practical limit for OS threads is ~10,000. Go programs routinely run 100,000+ goroutines