1.广播
当一个通道关闭时, 所有此通道的读取都会退出阻塞. 利用此特性可以实现广播功能
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan bool)
for i := 0; i < 5; i++ {
go func(n int) {
<-c //读取到数据或通道关闭时会退出阻塞
fmt.Println("收到通知:", n)
}(i)
}
fmt.Println("广播通知")
close(c) //关闭通道, 广播通知
time.Sleep(time.Second * 1) //等待其它协程处理
}
2.同时读取多个通道
有时需要监视多个通道, 这个时候可以使用select
package main
import (
"fmt"
"time"
)
func main() {
c1 := make(chan int)
c2 := make(chan int)
go func() {
var n int
select {
case n = <-c1:
case n = <-c2:
}
fmt.Println("数据:", n)
}()
fmt.Println("写入")
c1 <- 1
//c2 <- 2
close(c1)
close(c2)
time.Sleep(time.Second * 1) //等待其它协程处理
}
3.超时
channel本身无法设置超时, 可以使用select和定时器实现超时功能
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int, 1)
go func() {
timeout := false
var n int
select {
case n = <-c:
case <-time.After(time.Second * 1):
timeout = true
}
if timeout {
fmt.Println("超时")
} else {
fmt.Println("读取到数据:", n)
}
}()
time.Sleep(time.Second * 2)
c <- 2
time.Sleep(time.Second * 3) //等待其它协程处理
}