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

我正在学习 Go 并在go.dev/tour/concurrency/2看到了这个程序

package main


import "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应该是这样的:

  1. 创建一个临时元组 (b, a)

  1. 使用循环将 (b, a) 中的每个值分配给 (a, b) 中的变量

该方法似乎不适用于 GO 中的这种场合。a, b = b, a那么这句话中究竟发生了什么?


www说
浏览 131回答 1
1回答

杨魅力

a, b = b, a是一个赋值,更具体地说是一个元组赋值。规范中有详细说明:作业:元组赋值将多值运算的各个元素分配给变量列表。[...] 任务分两个阶段进行。首先,左侧的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右侧的表达式都按通常的顺序进行计算。其次,作业是按从左到右的顺序进行的。a,&nbsp;b&nbsp;=&nbsp;b,&nbsp;a&nbsp;&nbsp;//&nbsp;exchange&nbsp;a&nbsp;and&nbsp;bb因此,首先读取and的(当前)值a,然后将它们分配给a,&nbsp;b,从而有效地交换它们的值。这个:x,&nbsp;y&nbsp;:=&nbsp;<-c,&nbsp;<-c是一个简短的变量声明,它相当于一个带有初始化表达式但没有类型的常规变量声明:var&nbsp;x,&nbsp;y&nbsp;=&nbsp;<-c,&nbsp;<-c这将从c, 两次接收,并将接收到的值分配给x和y。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go