初识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()
发布了6 篇原创文章 · 获赞 1 · 访问量 7310
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览