首页 > 解决方案 > 从 Go 中的通道接收值

问题描述

为什么不将go sum(s[len(s)/2:], c)(第二个)返回的最后一个结果分配给x?这两个<-c让我很困惑。此代码来自A Tour of Go - [Channels]

package main

import "fmt"

func sum(s []int, c chan int) {   // int is the return value type
  sum := 0
  for _, v := range s {
    sum += v
  }
  c <- sum // Sends sum to c
}

func main() {
  s := []int{7, 2, 8, -9, 4, 0}

  c := make(chan int)
  go sum(s[:len(s)/2], c)
  go sum(s[len(s)/2:], c)

  x, y := <-c, <-c                 // receive from c

  fmt.Println(x, y, x+y)
}

标签: gochannelgoroutine

解决方案


你是说这条线吗?

x, y := <-c, <-c

那是一个“元组赋值”。

在这种情况下,它相当于做:

x := <-c
y := <-c

因此,从中读取的第二个值c将分配给y.

你可以在这里读更多关于它的内容:

https://golang.org/ref/spec#Assignments

关于值实际写入的顺序c,因为这里触发了两个独立的 goroutine:

go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)

它们最终处理和写入的顺序c不是“保证的”,因此您可以期望将其中一个值分配给不同的运行xy

由于正在添加这些值以计算最终结果,因此在这种情况下这不是问题。


推荐阅读