Ответ
Нет, структура горутины (g) создаётся не всегда. Горутины работают на существующих потоках планировщика (M), которые могут переиспользовать уже созданные структуры. Go использует пул горутин для оптимизации производительности.
Пример:
func main() {
for i := 0; i < 10; i++ {
go func(n int) {
fmt.Println(n)
}(i)
}
time.Sleep(time.Second)
}
В этом случае планировщик может переиспользовать уже существующие структуры горутин из пула, а не создавать новые каждый раз. Это уменьшает накладные расходы на создание и уничтожение горутин.