Запуск горутины в Go
Ключевое слово перед вызовом отправляет
функцию работать отдельно. Обычный вызов
ждет возврата, а с go управление
сразу переходит к следующей строке, пока
тело функции крутится в другой ветке.
Если main быстро доходит до конца,
процесс завершается и фоновая печать может
не успеть. В следующем уроке разберем
надежное ожидание; здесь для наглядности
после запуска можно ненадолго приостановить
main через time.Sleep, лишь
чтобы увидеть строку на экране.
Запустим короткую функцию с печатью:
package main
import (
"fmt"
"time"
)
func say() {
fmt.Println("from worker")
}
func main() {
go say()
time.Sleep(10 * time.Millisecond)
}
Без паузы строка "from worker" часто
пропадает: main заканчивается раньше
ветки. Пауза здесь только для демонстрации,
в реальной программе так не полагаются.
Тот же прием с анонимной функцией:
package main
import (
"fmt"
"time"
)
func main() {
go func() {
fmt.Println("inline")
}()
time.Sleep(10 * time.Millisecond)
}
Дана функция:
func mark() {
fmt.Println("mark")
}
В main запустите mark
отдельной веткой и коротко подождите,
чтобы строка успела напечататься.
Дан следующий код:
package main
import "fmt"
func ping() {
fmt.Println("ping")
}
func main() {
go ping()
}
Скажите, почему "ping" может не
появиться на экране.
Скажите, чем отличается обычный вызов
say от запуска say с
ключевым словом из первого примера.