لغة Go بالأمثلة: المؤقتات

نريد غالبًا تنفيذ كود Go في وقت ما مستقبلًا، أو تنفيذه مرارًا على فاصل زمني معين. تسهّل ميزتا المؤقت والمؤقت الدوري المدمجتان في Go هاتين المهمتين. سنتعرف أولًا على المؤقتات، ثم على المؤقتات الدورية.

package main
import (
    "fmt"
    "time"
)
func main() {

تمثل المؤقتات حدثًا واحدًا في المستقبل. تحدد للمؤقت المدة التي تريد انتظارها، فيوفر قناة تُشعَر عند انقضاء تلك المدة. سينتظر هذا المؤقت ثانيتين.

    timer1 := time.NewTimer(2 * time.Second)

تحجب <-timer1.C التنفيذ عند قناة المؤقت C حتى ترسل القناة قيمة تشير إلى انطلاق المؤقت.

    <-timer1.C
    fmt.Println("Timer 1 fired")

إذا أردت الانتظار فحسب، لأمكنك استخدام time.Sleep. من أسباب فائدة المؤقت إمكانية إلغائه قبل أن ينطلق. إليك مثالًا على ذلك.

    timer2 := time.NewTimer(time.Second)
    go func() {
        <-timer2.C
        fmt.Println("Timer 2 fired")
    }()
    stop2 := timer2.Stop()
    if stop2 {
        fmt.Println("Timer 2 stopped")
    }

امنح timer2 وقتًا كافيًا لينطلق لو كان سينطلق، لإظهار أنه متوقف بالفعل.

    time.Sleep(2 * time.Second)
}

سينطلق المؤقت الأول بعد نحو ثانيتين من بدء البرنامج، لكن ينبغي إيقاف الثاني قبل أن تتاح له فرصة الانطلاق.

$ go run timers.go
Timer 1 fired
Timer 2 stopped

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