从Go中的通道接收值

时间:2018-07-04 19:52:16

标签: go channel goroutine

为什么从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)
}

1 个答案:

答案 0 :(得分:3)

您是说这行吗?

hashMap, err := redis.StringMap(conn.Do("HGETALL", MyDict))
if err != nil {
    // handle error
}    
c.JSON(200, hashMap)

这是一个“元组分配”。

在这种情况下,它等效于:

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

因此将从x := <-c y := <-c 读取的第二个值分配给c

您可以在此处了解更多信息:

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

关于实际将值写入y的顺序,因为此处触发了两个独立的goroutine:

c

没有“保证”它们最终处理并写入go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) 的顺序,因此可以期望将其中一个值分别分配给cx运行。

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