示例:
go f(x, y, z)
通道是一种类型化的管道, 可以用于通过它们发送类型化的值到信道中进行通信
- 通道是引用类型,通道类型的空值是 nil;
- 通道的声明形式:var Name chan T;
- 通道的初始化形式:ch := make(chan T, [size]), size 表示缓冲区大小, 如果不设置 size, 则为无缓冲通道; 示例:
ch := make(chan int)
ch <- v // 将 v 发送至通道 ch
v := <-ch // 从 ch 接收值并赋予 v
通道是带有类型的管道, 可以通过它用通道操作符 <- 来发送或者接收值。
通道通过 make 创建, 默认是无缓冲的, 也就是说只有在对应的接收(<- chan) 通道准备好接收时, 才允许进行发送(chan <-) 通道的操作。
发送和接收必须同时准备好
- 通道可以是有缓冲的。为 make 提供第二个参数作为缓冲长度来初始化一个缓冲通道:
- 缓冲填满后发送会阻塞,缓冲为空时接收会阻塞。
ch := make(chan int, 2)
- 获取通道的缓冲区大小
// 结果为 2
cap(ch)
- 向带缓冲的通道发送数据的时候, 只有在缓冲区满的时候才会阻塞。 而当缓冲区为空的时候接收操作会阻塞。
通过 range 遍历通道
for i := range ch {
fmt.Println(i)
}
// 只有在通道 c 被关闭的情况下, 上面的循环才会结束。通道不像文件之类的,不需要经常去关闭, 只有当你确实没有任何发送数据了, 或者你想显式的结束 range 循环之类的。
- range 要配合 close 使用,一般情况下不需要关闭通道, 只有在需要告诉接收者不会再有值发送的时候才有必要关闭通道。
- 向一个已经关闭的通道发送数据会引发 panic。
- 通道关闭后, 仍然可以从通道接收数据, 但是数据都是通道类型的零值。
close(ch)
- select 语句使一个 Go 程可以等待多个通信操作;
- select 会阻塞到某个分支可以继续执行为止, 这时就会执行该分支。当多个分支都准备好的时候会随机选择一个执行;
- default 分支当其它所有 case 分支都在阻塞时就会执行。
没什么好讲的
var sfd string