初识go的chan

chan

chan: 信道/管道
特点:缓冲大小为零的时候,必须读写同步,否者程序会被阻塞(死锁)
例子:
package main
import "fmt"
var ch chan int = make(chan int)
func cun() {
	ch <- 0 // 2⃣
}
func qu(){
    fmt.println(<-ch)
}
func main() {
	cun() // 1⃣
	qu() // 3⃣
}
这段代码会阻塞,原因如下:
1⃣函数里面有个2⃣
2⃣正在寸入,但是ch没有缓冲大小了,存不进0这个值,于是阻塞了;必须等到取了才能写入,或者改变ch的缓冲大小把0存入
3⃣是取ch,可是根本到不了这个地方,因为1⃣步骤阻塞了;
死锁:2⃣在等3⃣,可是3⃣又在等2⃣;

解决方案:
一,cun() 这一行改成: go cun() // 异步执行foo()
二,调换cun(), qu() 的执行;改成:
    go qu()
    cun()
注意,不能写成如下两个顺序
    1) cun()
        go qu()
    2)  qu()
        go cun()
    // 因为会在go 的上一步就阻塞了,go的作用函数压根没有执行到
三,声明的时候增加一个缓冲大小,声明改成:var ch chan int = make(chan int, 1)
    执行顺序必须如下:
        cun()
        qu()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值