Завершение дополнительных фоновых горутин сразу после завершения основной main() - Как это работает

Да, после завершения основной горутины из main() другие тоже завершаются превентивно (условно "немедленно").

Демонстрация в коде

Это можно продемонстрировать на примере кода:

package main

import (
	"log"
	"os"
	"time"
)

func main() {
	f, err := os.Create("./test.txt")
	if err != nil {
		log.Fatal("can not write to a file", err)
	}
	// запускаем горутину
	go func() {
		// она будет бесконечно писать в файл каждую секунду
		for {
			f.WriteString("new line created at: " +
				time.Now().String() + "\n")
			time.Sleep(1 * time.Second)
		}
	}()
	// ждем 5 секунд в главной горутине
	time.Sleep(5 * time.Second)
	// но на деле выполнение вышезапущенной горутины
	// тоже прекратиться через 5 секунд
}

-- здесь для демонстрации прекращения работы фоновой горутины, после завершения работы главной горутины из main() используется запись в файл, который создается в той же папке, в которой лежит запускаемая программа.

То есть после завершения функции main():

  1. golang не ждет завершения неглавных горутин, после завершения главной, а просто их вырубает
  2. Важно отметить, что любые операторы отложенного выполнения (типа defer) внутри этих фоновых горутин выполняться не будут.
  3. Пока горутины завершаются, операционная система всё равно будет освобождать память и ресурсы процесса (например, файловые дескрипторы), но внутренняя логика приложения (например, корректное закрытие соединения с базой данных) будет пропущена.

Источники