|
Fechar um canal indica que mais nenhum valor será enviado para ele. Isto pode ser útil para comunicar a finalização dos recebimentos. |
|
![]()
package main |
|
import "fmt" |
|
|
Neste exemplo será usado um canal |
func main() { tarefas := make(chan int, 5) pronto := make(chan bool) |
|
Aqui está a worker goroutine. Ela repetidamente recebe
do canal |
go func() {
for {
t, mais := <-tarefas
if mais {
fmt.Println("received job", t)
} else {
fmt.Println("received all tarefas")
pronto <- true
return
}
}
}()
|
|
Isto envia 3 tarefas para a worker goroutine pelo canal
|
for t := 1; t <= 3; t++ {
tarefas <- t
fmt.Println("sent job", t)
}
close(tarefas)
fmt.Println("sent all tarefas")
|
|
A execução é aguardada utilizando a sincronização, como apresentado anteriormente. |
<-pronto
}
|
$ go run closing-channels.go sent job 1 received job 1 sent job 2 received job 2 sent job 3 received job 3 sent all jobs received all jobs |
|
|
A ideia de canais fechados leva naturalmente ao próximo
exemplo: |
Próximo exemplo: Range over Channels.