All the goroutines created in Go are under the management of an internal scheduler. The Go scheduler tries to give running time to all goroutines and keep all CPU busy with running goroutines when the current ones are blocked or terminated. It actually runs as a special goroutine.
Go limits the number of OS thread running thanks to
GOMAXPROCS variable simultaneously. That means Go has to schedule and manage goroutines on each of the running threads. This role is delegated to a special goroutine, called
g0, that is the first goroutine created for each OS thread:
Then, it will schedule ready goroutines to run on the threads.