Goroutinleri iptal etmek için birçok seçenek vardır, ancak bu örnek bize bir kanalı bu amaçla nasıl kullanabileceğimizi göstermektedir. Üç goroutine çalıştıracağız ve bunlardan biri "done" kanalına yazar yazmaz, diğerleri iptal edilecek. Her goroutinin üç kez baskı yapması amaçlanmıştır.


Örnek


package main

import (
"log"
"time"
)

func main() {
done := make(chan struct{})

go run(done, 1)
go run(done, 2)
time.Sleep(time.Second) // Cause the last one to not complete all three jobs
go run(done, 3)

<-done
}

func run(done chan<- struct{}, id int) {
i := 1

ticker := time.NewTicker(time.Second)
defer ticker.Stop()

for {
select {
case <-ticker.C:
// Do something here
log.Println(id, "- done", i)

i++
if i == 4 {
done<- struct{}{}
}
}
}
}

Sonuç


Aşağıda görüldüğü gibi üçüncü goroutine üç kez baskı yapma şansına sahip olamamıştır.


2020/06/16 22:32:24 2 - done 1
2020/06/16 22:32:24 1 - done 1
2020/06/16 22:32:25 2 - done 2
2020/06/16 22:32:25 1 - done 2
2020/06/16 22:32:25 3 - done 1
2020/06/16 22:32:26 1 - done 3
2020/06/16 22:32:26 2 - done 3