func main() {
var intChan chan int
intChan = make(chan int,100)
for i := 0; i < 100; i++ {
intChan <- i
}
//如果不关闭则会deadlock
close(intChan)
for v := range intChan{
fmt.Println(v)
}
}
五、channel 使用细节和注意事项
channel 可以声明为只读,或者只写性质。
//只写
var Chan chan<- int64
Chan = make(chan int64, 2)
Chan <- 5
num := <-Chan //报错
fmt.Println(num)
//只读
var Chan2 <-chan int64
Chan2 <- 2 //报错
fmt.Println(Chan2)
使用 select 可以解决从管道取数据的阻塞问题实例
package main
import (
"fmt"
"time"
)
func main() {
//使用 select 可以解决从管道取数据的阻塞问题
//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 {
//会自动到下一个 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 :
fmt.Printf("都取不到了,可以加入逻辑\n")
time.Sleep(time.Second)
return
}
}
}