从 Go 中的通道接收值

Receiving values from channels in 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)
}

你是说这一行吗?

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

那是 "tuple assignment"。

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

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

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

您可以在此处阅读更多相关信息:

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

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

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

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

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