Goroutinlar

Goroutina — Go'dagi yengil ijro oqimi (lightweight thread). Ular yordamida funksiyalarni bir vaqtda (concurrently) bajarish mumkin.
package main

import (
    "fmt"
    "time"
)

func f(from string) {
    for i := range 3 {
        fmt.Println(from, ":", i)
    }
}

func main() {
    // Oddiy (synchronous) chaqiruv
    f("direct")

    // Funksiyani goroutina sifatida chaqirish: chaqiruvchi bilan parallel ishlaydi
    go f("goroutine")

    // Anonim funksiyani ham goroutina sifatida ishga tushirish mumkin
    go func(msg string) {
        fmt.Println(msg)
    }("going")

    // Ikkala goroutina ham asinxron ishlayapti; ularga imkon berish uchun biroz kutamiz
    // (amaliyotda WaitGroup ishlatish yanada to'g'ri)
    time.Sleep(time.Second)
    fmt.Println("done")
}

Dastur ishga tushganda avval bloklovchi chaqiruv chiqishi, so'ng goroutinlarning natijalari chiqishi mumkin. Goroutinlar parallel ishlagani sabab ularning chiqishlari aralashib ketishi tabiiy.

Terminalda bajarish:

$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

Keyingi bo'limda concurrent dasturlashdagi goroutinalarning "hamrohi" — kanallarni (channels) ko'rib chiqamiz.