The cost that shapes the architecture
An operating system thread is expensive in two ways, and both shape how programs get written.
It has a fixed stack, typically reserved at a megabyte or more, because the kernel cannot grow it later. Ten thousand threads is ten gigabytes of address space reserved before anything runs.
And switching between threads means a kernel transition: save registers, enter the kernel, run the scheduler, restore, return. It is not catastrophic and it is far from free, and it happens constantly.
So languages built on OS threads develop the same defensive architecture. Thread pools exist so threads are reused rather than created. Asynchronous and event-loop designs exist so one thread serves many connections, which the lesson Async, Event Loops, and Futures covers.
Every one of those is a workaround for the same cost. Go's approach is to attack the cost directly, and much of the language's character follows from the attack succeeding.

