我正在学习 Go 并在go.dev/tour/concurrency/2看到了这个程序package mainimport "fmt"func sum(s []int, c chan int) { sum := 0 for _, v := range s { sum += v } c <- sum // send 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)}我记得在python中的执行流程a, b = b, a应该是这样的:创建一个临时元组 (b, a)使用循环将 (b, a) 中的每个值分配给 (a, b) 中的变量该方法似乎不适用于 GO 中的这种场合。a, b = b, a那么这句话中究竟发生了什么?
1 回答
杨魅力
TA贡献1811条经验 获得超6个赞
a, b = b, a是一个赋值,更具体地说是一个元组赋值。
规范中有详细说明:作业:
元组赋值将多值运算的各个元素分配给变量列表。
[...] 任务分两个阶段进行。首先,左侧的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右侧的表达式都按通常的顺序进行计算。其次,作业是按从左到右的顺序进行的。
a, b = b, a // exchange a and b
b因此,首先读取and的(当前)值a,然后将它们分配给a, b,从而有效地交换它们的值。
这个:
x, y := <-c, <-c
是一个简短的变量声明,它相当于一个带有初始化表达式但没有类型的常规变量声明:
var x, y = <-c, <-c
这将从c, 两次接收,并将接收到的值分配给x和y。
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报
0/150
提交
取消
