Вы должны дождаться завершения всех процедур в главном потоке вашей программы (или, скажем, в основном методе).
Давайте рассмотрим пример
package main
import (
"fmt"
"time"
)
func foo() {
go func() {
fmt.Println("sleeping for 5 sec")
time.Sleep(5 * time.Second)
fmt.Println("Done")
}()
}
func main() {
foo()
}
Когда вы запустите указанный выше код, он немедленно завершится (означает, что главный поток не будет ждать, пока выполнение goroutine завершится первым).
Для достижения этого в go Я использую https://golang.org/pkg/sync/#WaitGroup
package main
import (
"fmt"
"sync"
"time"
)
// see https://golang.org/pkg/sync/#WaitGroup
var wg sync.WaitGroup
func foo() {
go func() {
wg.Add(1)
defer wg.Done()
fmt.Println("sleeping for 5 sec")
time.Sleep(5 * time.Second)
fmt.Println("Done")
}()
}
func main() {
foo()
fmt.Println("Waiting for goroutine to finish")
wg.Wait()
fmt.Println("All goroutine to finished")
}