为了账号安全,请及时绑定邮箱和手机立即绑定

通过无缓冲通道同时分配 Go 语言:它是如何工作的?

通过无缓冲通道同时分配 Go 语言:它是如何工作的?

Go
www说 2022-10-17 10:21:00
我正在学习 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,然后将它们分配给ab,从而有效地交换它们的值。

这个:

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

是一个简短的变量声明,它相当于一个带有初始化表达式但没有类型的常规变量声明:

var x, y = <-c, <-c

这将从c, 两次接收,并将接收到的值分配给xy


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号