280_尚硅谷_管道的注意事项和细节(2)
1.channel使用细节和注意事项
2.3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】_代码
package main
import (
"fmt"
"time"
)
// todo 3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】
func main() {
// 1. 定义一个管道 10个数据int
intChan := make(chan int, 10)
for i := 0; i < 10; i++ {
intChan <- i
}
// 2. 定义一个管道 5个数据string
stringChan := make(chan string, 5)
for i := 0; i < 5; i++ {
stringChan <- "hello" + fmt.Sprintf("%d", i)
}
// 传统的方法在遍历管道时如果不关闭会阻塞而导致死锁(deadlock)
// 问题, 在实际开发中,可能不好确定管道关闭时间
// 可以使用select方式可以解决
for {
select {
// 注意: 这里如果intChan一直没有关闭,不会一直阻塞而deadlock,会自动到下一个case分支
case v := <-intChan:
fmt.Printf("从intChan读取的数据%d\n", v)
time.Sleep(time.Second)
case v := <-stringChan:
fmt.Printf("从stringChan读取的数据%s\n", v)
time.Sleep(time.Second)
default:
// ! 取不到数据直接renturn退出函数
fmt.Printf("都取不到数据\n")
time.Sleep(time.Second)
return
}
}
}
3.3) 使用slect 可以解决从管道取数据的阻塞问题【案例演示】_运行结果
浙公网安备 33010602011771号