我正在學(xué)習(xí) 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中的執(zhí)行流程a, b = b, a應(yīng)該是這樣的:創(chuàng)建一個臨時元組 (b, a)使用循環(huán)將 (b, a) 中的每個值分配給 (a, b) 中的變量該方法似乎不適用于 GO 中的這種場合。a, b = b, a那么這句話中究竟發(fā)生了什么?
1 回答

楊魅力
TA貢獻(xiàn)1811條經(jīng)驗 獲得超6個贊
a, b = b, a
是一個賦值,更具體地說是一個元組賦值。
規(guī)范中有詳細(xì)說明:作業(yè):
元組賦值將多值運算的各個元素分配給變量列表。
[...] 任務(wù)分兩個階段進(jìn)行。首先,左側(cè)的索引表達(dá)式和指針間接(包括選擇器中的隱式指針間接)的操作數(shù)和右側(cè)的表達(dá)式都按通常的順序進(jìn)行計算。其次,作業(yè)是按從左到右的順序進(jìn)行的。
a, b = b, a // exchange a and b
b
因此,首先讀取and的(當(dāng)前)值a
,然后將它們分配給a
, b
,從而有效地交換它們的值。
這個:
x, y := <-c, <-c
是一個簡短的變量聲明,它相當(dāng)于一個帶有初始化表達(dá)式但沒有類型的常規(guī)變量聲明:
var x, y = <-c, <-c
這將從c
, 兩次接收,并將接收到的值分配給x
和y
。
- 1 回答
- 0 關(guān)注
- 106 瀏覽
添加回答
舉報
0/150
提交
取消