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还在跑,没有给结果呢?
有疑问加站长微信联系(非本文作者)

如果没有结果,chan 会阻塞的,等待,知道有结果
楼上正解。。。一直阻塞直到读出数据。。
sum1, sum2 := <-resultChan, <-resultChan这句你可以当成这样看: sum1:=<-resultChan sum2:=<-resultChan 从channal取一个数据赋给sum1,取一个赋给sum2,赋值完成程序继续向下走,(协程的运行先后由系统调度决定,sum1,sum2谁先赋值完成不确定)没有的话就等着