chan 在定义的时候设置缓存,或者定义一个协程,去获取chan 传输
如果不是这两种解决方案,会出现线程死锁问题
可以自行尝试
采用goroutine 并发执行
go
//go 采用协程处理接受chan
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, 世界")
// 创建一个整数类型的通道
ch1 := make(chan int)
ch2 := make(chan int)
// 启动一个 Goroutine 并发地将通道 ch1 中的数据发送到通道 ch2 中
go func() {
tmp := <-ch1
ch2 <- tmp
fmt.Println("tmp ", tmp)
}()
// 向通道 ch1 发送数据
ch1 <- 22
// 从通道 ch2 中接收数据
data := <-ch2
// 打印接收到的数据
fmt.Println("data:", data)
fmt.Println("test end....")
}
输出结果
bash
Hello, 世界
data: 22
test end....
设置chan 缓冲
go
fmt.Println("Hello, 世界")
// 创建一个整数类型的通道
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
ch1 <- 22
tmp := <-ch1
// 从通道 ch2 中接收数据
ch2 <- tmp
tmp2 := <-ch2
// 打印接收到的数据
fmt.Println("tmp: ", tmp, "tmp2: ", tmp2)
fmt.Println("test end....")
执行结果
bash
Hello, 世界
tmp: 22 tmp2: 22
test end....
总结
go 的并发特别方便,成本也比开辟线程要低,那么同样的也会更容易的带来死锁问题。