V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bandian
V2EX  ›  问与答

请问如何正确理解 go 的 goroutine 和 channel

  •  
  •   bandian · 2020 年 3 月 5 日 · 790 次点击
    这是一个创建于 2221 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面的程序

    package main
    
    import "fmt"
    
    func main() {
    	ch := make(chan int)
    	go hello(ch)
    	go world(ch)
    	fmt.Println(<-ch, <-ch)
    }
    
    func hello(ch chan int) {
    	ch<-5
    }
    
    func world(ch chan int){
    	ch<-10
    }
    

    有时候输出是 5 10 有时候是 10 5

    我是否可以这样理解,hello()跟 world()两个函数是同时执行的,有时候是 hello 先执行完,然后 ch 阻塞,ch 的值就被读取然后放在 Println 的第一个 ch 位置上,然后阻塞解除,之后 world 也向 channel 写入了数据阻塞,然后 ch 又把值读取到了 Println 的第二个 ch 的位置上。

    输出结果不同就是因为两个程序执行的速度不同导致的。

    目前尚无回复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1378 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:51 · PVG 00:51 · LAX 09:51 · JFK 12:51
    ♥ Do have faith in what you're doing.