go关于channel一些问题

chydn 2016-11-16 11:19:16
本人学go语言新手,麻烦大神指点
package main
import "fmt"
func sum(a []int, c chan int) {
sum := 0
for _, v := range a {
sum += v
}
c <- sum // send sum to c
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
x, y := <-c, <-c // receive from c
fmt.Println(x, y, x + y)
执行结果是:-5 17 12
go语言channel不是先进先出吗,为啥先打印x是-5而不是17?”
...全文
171 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxingge2010 2016-11-18
  • 打赏
  • 举报
回复
Channel 没有错哟,这个结果是因为调试器先执行了第二个routine.
chydn 2016-11-18
  • 打赏
  • 举报
回复
引用 2 楼 wangxingge2010 的回复:
Channel 没有错哟,这个结果是因为调试器先执行了第二个routine.
恩,并行的问题
chydn 2016-11-18
  • 打赏
  • 举报
回复
引用 1 楼 cjqpker 的回复:
这个问题在于,go sum 两个 goroutine 启动之后并行执行,并不能确定是哪个先计算完,所以 -5 和 17 进入 channel 的顺序是不确定的。channel 的确是先进先出的,毫无疑问。
多谢,明白了
假正经的班长 2016-11-17
  • 打赏
  • 举报
回复
这个问题在于,go sum 两个 goroutine 启动之后并行执行,并不能确定是哪个先计算完,所以 -5 和 17 进入 channel 的顺序是不确定的。channel 的确是先进先出的,毫无疑问。

2,187

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧