Sospensioni e ticker
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 64 di 68.
A volte devi controllare i tempi di esecuzione del tuo programma. Go fornisce due funzioni essenziali nel pacchetto time a questo scopo: time.Sleep per mettere in pausa l'esecuzione e time.NewTicker per eseguire azioni a intervalli regolari.
La funzione time.Sleep mette in pausa il programma per una durata specificata. Accetta un time.Duration come parametro e blocca l'esecuzione finché non è trascorso quel periodo:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")Per azioni ripetute a intervalli regolari, time.NewTicker crea un ticker che invia valori su un canale a intervalli specificati. È utile per le attività che devono essere eseguite periodicamente:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Attendi il prossimo tick
fmt.Println("Tick", i+1)
}Queste funzioni di temporizzazione sono essenziali per creare ritardi, implementare timeout e pianificare operazioni ricorrenti nei tuoi programmi Go.
Sfida
FacileCrea un timer per sessioni di meditazione che utilizzi time.Sleep per creare pause tra le istruzioni guidate e dimostri il controllo temporale di base nei programmi Go.
Riceverai due input:
- Una stringa contenente i passaggi di meditazione nel formato
"step1:duration,step2:duration,step3:duration"(ad es.,"Breathe in:3,Hold:2,Breathe out:4") - Una stringa contenente il numero di cicli da ripetere (ad es.,
"5")
Il tuo compito è:
- Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere i singoli passaggi di meditazione
- Per ogni passaggio, dividerlo in corrispondenza dei due punti per estrarre l’istruzione e la durata (in secondi)
- Convertire le stringhe delle durate in interi utilizzando il pacchetto
strconv - Convertire il secondo input in un intero per ottenere il numero di cicli
- Visualizzare l’intestazione della sessione:
"=== MEDITATION TIMER ===" - Visualizzare la configurazione della sessione:
"Starting meditation session with [number_of_cycles] cycles" - Per ogni ciclo (a partire dal ciclo 1):
- Visualizzare:
"--- Cycle [cycle_number] ---" - Per ogni passaggio di meditazione:
- Visualizzare:
"[instruction]..." - Utilizzare
time.Sleepper mettere in pausa l’esecuzione per la durata specificata (convertire i secondi intime.Durationmoltiplicandoli pertime.Second) - Dopo la pausa, visualizzare:
"[instruction] complete ([duration] seconds)"
- Visualizzare:
- Dopo aver completato tutti i passaggi di un ciclo, visualizzare:
"Cycle [cycle_number] finished"
- Visualizzare:
- Dopo aver completato tutti i cicli, visualizzare il riepilogo della sessione:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(la somma delle durate di tutti i passaggi moltiplicata per il numero di cicli)
- Visualizzare il messaggio di completamento:
"Meditation session finished - well done!"
Utilizza il pacchetto time per le operazioni di pausa, il pacchetto strings per dividere le stringhe di input, il pacchetto strconv per convertire le stringhe in interi e il pacchetto fmt per l’output. Ricorda che time.Sleep accetta un parametro time.Duration, quindi devi moltiplicare i secondi interi per time.Second per creare un valore di durata appropriato. Questa sfida mostra come utilizzare time.Sleep per creare pause temporizzate durante l’esecuzione di un programma, in applicazioni pratiche come i timer per la meditazione guidata o per l’esercizio fisico.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Leggi l'input usando bufio.Scanner per gestire correttamente gli spazi
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Analizza i passaggi della meditazione e i cicli
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Scrivi il tuo codice qui sotto
// Analizza ogni passaggio per ricavare l'istruzione e la durata
// Ricorda di verificare che lo slice parts contenga abbastanza elementi prima di accedervi
// Mostra l'intestazione della sessione e le informazioni iniziali
// Scorri i cicli e i passaggi
// Usa time.Sleep per le pause (valuta l'uso dei millisecondi per i test)
// Mostra i messaggi di completamento e il riepilogo
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività7Gestione degli errori in dettaglio
Tipi di errore personalizzatiAvvolgere gli errori con `%w`Rimuovere il wrapping con `errors.Is`Rimuovere il wrapping con `errors.As`Capire `panic`Usare `recover`Riepilogo - Divisione sicura10Lavorare con il tempo
Ottenere l'ora correnteCreare un orario specificoFormattare l'oraAnalizzare stringhe di tempoDurata temporaleOperazioni aritmetiche con il tempoSospensioni e tickerRiepilogo - Timer semplice2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online