我正在學習 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 關注
- 97 瀏覽
添加回答
舉報
0/150
提交
取消