一 channel 的关闭
1 点睛
使用内置函数 close 可以关闭 channel, 当 channel 关闭后,就不能再向 channel 写数据了,但是仍然可以从该 channel 读取数据。
2 代码
package main
import (
"fmt"
)
func main() {
intChan := make(chan int, 3)
intChan <- 100
intChan <- 200
close(intChan) // close
// 这时不能够再写入数到 channel
// intChan<- 300
fmt.Println("okook~")
// 当管道关闭后,读取数据是可以的
n1 := <-intChan
fmt.Println("n1=", n1)
}
3 测试
okook~
n1= 100
二 channel 的遍历
1 点睛
channel 支持 for range 的方式进行遍历,需要注意两个细节。
a 在遍历时,如果 channel 没有关闭,则回出现 deadlock 的错误。
b 在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。
三 channel 遍历和关闭实战
1 代码
package main
import (
"fmt"
)
func main() {
// 遍历管道
intChan2 := make(chan int, 10)
for i := 0; i < 10; i++ {
intChan2 <- i * 2 // 放入100个数据到管道
}
close(intChan2)
for v := range intChan2 {
fmt.Println("v=", v)
}
}
2 测试
v= 0
v= 2
v= 4
v= 6
v= 8
v= 10
v= 12
v= 14
v= 16
v= 18