Junior — Middle
Come si può terminare l'esecuzione di un programma quando viene richiesta l'interruzione del suo funzionamento nel contesto attuale?
sobes.tech AI
Risposta dell'AI
In Go, per terminare correttamente un programma su richiesta di arresto, si utilizza generalmente un contesto (context.Context) con cancellazione. Questo permette di inviare un segnale di cancellazione alle goroutine e di terminarle correttamente.
Esempio:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Monitorare i segnali di sistema per l'arresto
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Segnale di arresto ricevuto")
cancel() // inviare il segnale di cancellazione al contesto
}()
// Avviare il lavoro che ascolta il contesto
work(ctx)
}
func work(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Terminazione del lavoro")
return
default:
fmt.Println("Lavoro in corso...")
time.Sleep(1 * time.Second)
}
}
}
In questo modo, al ricevimento del segnale di sistema operativo, il programma termina correttamente tutti i processi ed esce.