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

2020-03-05 17:48:22 +08:00
 bandian

比如下面的程序

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 的位置上。

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

546 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/650156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX