channel 管道
介绍
与数据结构的队列相同, 先进先出, 如果没有值就使用与内容超出容量长度会报错
读写权限
- 只读
关键字: chan<-
语法:
- 定义
var chan_variable = chan<-<Type>` - 初始化:
var chan_variable = make(chan\<- \<Type\>, \<Size\>)
例子:
var chan1 chan<- int // 定义未初始化var chan1 = make(chan<- int, 10, 10) // 初始化func main { // 简短的初始化 chan1 := make(chan<- int, 10, 10)}- 只写
关键字: <-chan
语法:
- 定义
var chan_variable = <-chan<Type>` - 初始化:
var chan_variable = make(\<-chan \<Type\>, \<Size\>)
例子:
var chan2 <- chan intvar chan2 = make(<-chan int, 10)func main { chan2 := make(<- chan int, 10)}取值
- 循环
for i
var chan3 = make(chan int,10)
chan3 <- 20for i := 0; i < len(chan3); i++ { fmt.Println(<-chan3)}for range
var chan4 = make(chan int,10)chan4 <- 20
for value := range { fmt.Println(<-chan4)}阻塞
管道如果只写入, 但不读取的情况下, 会抛出异常: fatal error: all goroutines are asleep - deadlock!(致命错误:
所有的goroutine都睡着了-死锁!)
解决方案: 写入必须读取