Горутини (Goroutines)|Goroutines
#
// _goroutine_ (надалі просто _горутина_) це легковісний [потік виконання](https://uk.wikipedia.org/wiki/Потік_(інформатика)).
package main
import (
"fmt"
"time"
)
// Функція, якою ми скористаємось, за кілька хвилин.
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
// Припустимо ми маємо виклик функції у вигляді `f(s)`. Це, так званий,
// звичайним (синхронний) спосіб.
f("direct")
// Щоб запустити виконання функції в горутині, скористаймось
// синтаксисом запуску горутини `go f(s)`, таким чином горутина
// буде виконуватись одночасно з викликом.
go f("goroutine")
// Аналогічним чином можна запускати в горутини анонімні функції.
go func(msg string) {
fmt.Println(msg)
}("going")
// Наші два виклики функції працюють асинхронно у окремих горутинах,
// зачекаємо поки вони завершаться. Для більш стабільної роботи скористайтесь
// [WaitGroup'ами](waitgroups).
time.Sleep(time.Millisecond)
fmt.Println("done")
}
# Коли ми запустимо нашу програму, ми побачимо
# спершу результат блокуючого виклику, а вже
# потім результат виконання двох горутин.
# Як ми можете помітити, обидві горутини
# виконуються одночасно ії виконання контролюється
# середовищем виконання Go.
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done
# На додаток до механізмів асинхронного виконання,
# таких як горутини, ми зараз розгялнемо _Канали_.