لغة Go بالأمثلة: روتينات Go

روتين Go (goroutine) هو خيط تنفيذ خفيف الوزن.

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

لنفترض أن لدينا استدعاء الدالة f(s). هكذا نستدعيها بالطريقة المعتادة، فتعمل بصورة متزامنة.

    f("direct")

لاستدعاء هذه الدالة داخل روتين Go، استخدم go f(s). سيعمل روتين Go الجديد بالتزامن مع الروتين الذي استدعاه.

    go f("goroutine")

يمكنك أيضًا بدء روتين Go لاستدعاء دالة مجهولة.

    go func(msg string) {
        fmt.Println(msg)
    }("going")

يعمل استدعاءا الدالة الآن بصورة غير متزامنة في روتيني Go منفصلين. انتظر حتى ينتهيا (ولطريقة أكثر متانة، استخدم مجموعة انتظار).

    time.Sleep(time.Second)
    fmt.Println("done")
}

عند تشغيل هذا البرنامج، نرى أولًا خرج الاستدعاء الحاجز، ثم خرج روتيني Go. قد تتداخل أسطر خرجهما لأن بيئة تشغيل Go تشغّلهما بالتزامن.

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

سنتعرف تاليًا على ما يكمل روتينات Go في برامج Go المتزامنة: القنوات.

المثال التالي: .