通道具有关闭通道的关闭操作,因此无法在通道上进行发送操作。在关闭的通道上进行发送操作将导致恐慌。
在通道上执行接收操作时,我们检查通道是否关闭,如果通道关闭,则从goroutine退出。
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
ch := make(chan string)
go func() {
for {
channel, ok := <-ch
if !ok {
fmt.Println("Shut Down")
defer wg.Done()
return
}
fmt.Println(channel)
}
}()
ch <- "Start"
ch <- "Processing"
ch <- "Finishing"
close(ch)
wg.Wait()
}
运行上面的程序时,您可以看到以下输出:
C:\Golang\goroutines>go run main.go
Start
Processing
Finishing
Shut Down