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

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

  •  
  •   bandian · 2020-03-05 17:48:22 +08:00 · 545 次点击
    这是一个创建于 1724 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面的程序

    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   ·   实用小工具   ·   2754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.