Чем запуск горутины отличается от запуска функции?
Потому-что горутина запускается в новом "потоке" приложения и главный поток не блокируется.
Чтобы дождаться завершения работы всех горутин, нужно использовать sync.WaitGroup
https://gobyexample.com/waitgroups
https://golang.org/pkg/sync/#example_WaitGroup
Выполнение потока (работа функции, вызвавшей горутину) прерывается независимо от срабатывания горутины. Грубо: успела горутина отработать - молодец, не успела - не судьба.
В отличии от функции - завершение которой поток обязательно дождётся.
Чтобы приравнять в этом смысле горутину к функции, надо вместе с горутиной либо указать хорошую задержку выполнения потока (что не даёт гарантии выполнения ВСЕХ горутин, тут как со временем угадаешь); либо использовать sync.WaitGroup (тогда горутины гарантировано отработают - как функции).
Верно?