对不同状态的channel操作会出现的情况

警告
本文最后更新于 2021-04-15,文中内容可能已过时。
1
2
3
var ch chan int    // 定义nil channel
value, ok := <-ch
// 阻塞: fatal error: all goroutines are asleep - deadlock!
1
2
3
4
5
6
7
8
9
ch := make(chan int, 10)
for i := 0; i < 10; i++ {
	ch <- i
}
close(ch)
for v := range ch {
	fmt.Printf("v: %v|", v)
}
// 输出值: v: 0|v: 1|v: 2|v: 3|v: 4|v: 5|v: 6|v: 7|v: 8|v: 9|
1
2
3
ch := make(chan int)
value, ok := <-ch
// 阻塞: fatal error: all goroutines are asleep - deadlock!
1
2
3
4
5
6
ch := make(chan int,1)
close(ch)
val, ok := <-ch
fmt.Printf("val: %v, ok: %v\n", val, ok) // val: 10, ok: true
val, ok = <-ch
fmt.Printf("val: %v, ok: %v\n", val, ok) // val: 0, ok: false
1
2
3
4
ch := make(chan<- int, 1)
ch <- 1
x := <-ch // 编译错误: invalid operation: cannot receive from send-only channel ch (variable of type chan<- int)
fmt.Println(x)
1
2
3
var ch chan int  // 定义一个空的管道
ch <- 1          // 尝试向管道写入数据
// 阻塞:fatal error: all goroutines are asleep - deadlock!
1
2
3
4
5
6
7
var ch = make(chan int, 10)   // 定义一个有 10 个元素的管道
// 尝试填满管道
for i:=0; i < 10; i++ {
    ch <- i
}
ch <- 11                     // 尝试向管道写入第11个元素
// 阻塞:fatal error: all goroutines are asleep - deadlock!
1
2
3
var ch = make(chan int, 10)  // 定义一个有10个元素的管道
ch <- 1                      // 尝试向 管道中 写入第1个元素
// 成功写入!
1
2
3
4
var ch = make(chan int, 10)    // 定义一个有 10 个元素的管道
close(ch)                      // 关闭管道
ch <- 11
// panic: send on closed channel
1
2
var ch = make(<-chan int, 10)   // 定义一个有 10 个元素的管道
ch <- 11      // 编译错误 invalid operation: cannot send to receive-only channel c (variable of type <-chan int) 的的编译错误
1
2
3
var ch chan int
close(ch)
// panic: close of nil channel
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ch := make(chan int, 2)
ch <- 1
ch <- 2
value, ok := <-ch
fmt.Println(value, ok) // 1 true
close(ch)
value, ok = <-ch
fmt.Println(value, ok) // 2 true
value, ok = <-ch
fmt.Println(value, ok) // 0 false
// 关闭channel,读取成功,知道通道耗尽,然后读取产生值的默认值
1
2
3
4
ch := make(chan int, 2)
close(ch)
value, ok := <-ch
fmt.Println(value, ok) // 0 false
1
2
3
4
ch := make(chan int, 2)
close(ch)
close(ch)
// panic: close of closed channel
1
2
3
ch := make(<-chan int, 2)
close(ch)
// 编译错误: invalid operation: cannot close receive-only channel ch (variable of type <-chan int)
操作 Channel状态 结果
Read nil 阻塞
打开且非空 输出值
打开但空 阻塞
关闭 默认值, false
只写 编译错误
Write nil 阻塞
打开且满 阻塞
打开且不满 写入值
关闭 panic
状态为只读 编译错误
Close nil panic
打开且非空 先读取值,后默认值
打开且空 默认值
关闭 panic
只读 编译错误

相关内容