1. 使用make命令创建channel
// 未设置缓冲区, 只能放一个,不读取再次赋值则会阻塞
c1 := make(chan int)
// 设置缓冲区,10个缓冲区就可以放10个值,不读取则无法放入第11个值
c2 := make(chan int, 10)
chan + int 设置channel类型为int,可以设置任意类型的channel
2. 发送数据(send)
ch <- 1
- 无缓冲区的channel只有在receiver准备好后send才被执行。如果有缓冲区,并且缓冲区未满,则send会被执行。
3. 读取channel数据(receive)
i := <-c
-
从一个nil channel中接收数据会一直被block。
-
从一个被close的channel中接收数据不会被阻塞,而是立即返回,接收完已发送的数据后会返回元素类型的零值(zero value)。
// 可以使用一个额外的返回参数来检查channel是否关闭。
x, ok := <-ch
//如果OK 是false,表明接收的x是产生的零值,这个channel被关闭了或者为空。
4. 关闭管道(close)
-
使用close()方法对管道进行关闭
-
如果channel c已经被关闭,继续往它发送数据会导致
panic: send on closed channel
: -
从已关闭的channel中可以读取出已发送的数据,读完后继续读取会读到零值。
-
通过
range
读取已关闭的channel,读出已发送数据后for循环会跳出:
c := make(chan int, 10)
c <- 1
c <- 2
close(c)
for i := range c {
fmt.Println(i)
}
通过i, ok := <-c
可以查看Channel的状态,判断值是零值还是正常读取的值。(同点3)
参考: https://www.runoob.com/w3cnote/go-channel-intro.html
练习: https://exercism.org/tracks/go/exercises/parallel-letter-frequency