chan 的疑惑

dolia · 2017-05-23 02:44:47 · 2847 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-05-23 02:44:47 的主题,其中的信息可能已经有所发展或是发生改变。

package main
import "fmt"

func sum(values [] int, resultChan chan int) { sum := 0
    for _, value := range values { sum += value
    }
    resultChan <- sum // 将计算结果发送到channel中
}
func main() {

    values := [] int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    resultChan := make(chan int, 2)
    go sum(values[:len(values)/2], resultChan)
    go sum(values[len(values)/2:], resultChan)

    sum1, sum2 := <-resultChan, <-resultChan // 接收结果
    fmt.Println("Result:", sum1, sum2, sum1 + sum2)
}

这是《go 语言编程》里讲并发编程的一个小例子,读到这里有个疑惑。

go sum(values[:len(values)/2], resultChan)
go sum(values[len(values)/2:], resultChan)

以上两行代码计算数组的和运行以后,接着去chan里面取结果

  sum1, sum2 := <-resultChan, <-resultChan 

问题是:怎么就确定,此时chan里面已经有了累加结果? 万一sum还在跑,没有给结果呢?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2847 次点击  
加入收藏 微博
3 回复  |  直到 2017-05-24 01:52:34
polaris
polaris · #1 · 8年之前

如果没有结果,chan 会阻塞的,等待,知道有结果

631768417
631768417 · #2 · 8年之前

楼上正解。。。一直阻塞直到读出数据。。

MR_bai
MR_bai · #3 · 8年之前

sum1, sum2 := <-resultChan, <-resultChan这句你可以当成这样看: sum1:=<-resultChan sum2:=<-resultChan 从channal取一个数据赋给sum1,取一个赋给sum2,赋值完成程序继续向下走,(协程的运行先后由系统调度决定,sum1,sum2谁先赋值完成不确定)没有的话就等着

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传