Sobes.tech
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.