为什么从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)
}
答案 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)
的顺序,因此可以期望将其中一个值分别分配给c
和x
运行。
由于要添加值以计算最终结果,所以在这种情况下这不是问题。