```
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for {
select {
case v := <-ch1:
fmt.Println("ch1: ", v)
ch2 <- v // 到这里阻塞了
fmt.Println("send to ch2")
case v := <-ch2:
fmt.Println("ch2: ", v)
}
}
}()
ch1 <- 1
for {
time.Sleep(1 * time.Second)
}
}
```
程序输出
```
ch1: 1
```
向无缓存的chan发送数据,这个携程就被一直阻塞了,后一个case无法执行,因为这个携程处于阻塞态。而如果,你在外面接收`ch2`的数据,就会释放阻塞态。
```
...
ch1 <- 1
t := <-ch2
fmt.Println("ch2: --", t)
for {
time.Sleep(1 * time.Second)
}
...
```
输出结果:
```
ch1: 1
ch2: -- 1
send to ch2
```
而如果你想要实现你想要的结果,则只需要将给`ch2`发送数据,包含到另一个携程中:
```
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for {
select {
case v := <-ch1:
fmt.Println("ch1: ", v)
go func(v int) {
ch2 <- v // 这里阻塞子携程
fmt.Println("send to ch2")
}(v)
case v := <-ch2: // 父携程等待获取
fmt.Println("ch2: ", v)
}
}
}()
ch1 <- 1
for {
time.Sleep(1 * time.Second)
}
}
```
#2
更多评论