time.Tick în Go

Returnează un canal care primește o valoare la fiecare interval d, la nesfârșit; bun pentru sarcini repetate.

Sintaxă
func Tick(d Duration) <-chan Time

Ce face time.Tick

time.Tick(d) este o scurtătură pentru time.NewTicker(d).C: un canal care „bate” la fiecare d. Îl parcurgi cu for range sau îl folosești într-un select. Dacă d <= 0, returnează nil.

Din Go 1.23, ticker-ul din spate este eliberat automat când nu mai este folosit, deci time.Tick este bun și în programe care rulează mult. Dacă ai nevoie să oprești sau să schimbi intervalul, folosește time.NewTicker (cu Stop și Reset).

Parametri

Parametru Descriere
d Intervalul dintre bătăi.

Ce returnează

Un canal doar pentru citire (<-chan time.Time).

Exemple

Exemplul 1: Trei verificări la interval fix

package main

import (
	"fmt"
	"time"
)

func main() {
	n := 0
	for range time.Tick(100 * time.Millisecond) {
		n++
		fmt.Printf("Verificarea %d a serverului\n", n)
		if n == 3 {
			break
		}
	}
	fmt.Println("Gata")
}

Rezultat

Verificarea 1 a serverului
Verificarea 2 a serverului
Verificarea 3 a serverului
Gata

Exemplul 2: Bătăi și o oprire într-un select

Bucla primește bătăi până când sosește semnalul de oprire după 350 ms: 3 bătăi la 100, 200, 300 ms.

package main

import (
	"fmt"
	"time"
)

func main() {
	bataie := time.Tick(100 * time.Millisecond)
	stop := time.After(350 * time.Millisecond)
	salvari := 0
	for {
		select {
		case <-bataie:
			salvari++
			fmt.Println("Salvare automată", salvari)
		case <-stop:
			fmt.Println("Oprit după", salvari, "salvări")
			return
		}
	}
}

Rezultat

Salvare automată 1
Salvare automată 2
Salvare automată 3
Oprit după 3 salvări

Greșeli frecvente

  • Dai o durată calculată care poate fi 0: time.Tick(0) returnează nil, iar citirea dintr-un canal nil blochează pentru totdeauna.
  • Faci o operație care durează mai mult decât intervalul: bătăile pierdute nu se adună, canalul ține cel mult una. Ritmul real va fi mai rar decât crezi.

Comenzi înrudite

  • time.Ticker: Un ceas care trimite câte o valoare pe canalul C la fiecare interval; Stop îl oprește, Reset îi schimbă intervalul.
  • time.After: Returnează un canal care primește ora curentă după durata dată; folosit în select pentru limite de timp (timeout).
  • time.Timer: Un temporizator care trimite un singur semnal pe canalul C după o durată; poate fi oprit (Stop) sau repornit (Reset).