我正在學習 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應該是這樣的:
- 創建一個 (b, a) 的臨時元組
- 用回圈將 (b, a) 中的每個值分配給 (a, b) 中的變數
該方法似乎不適用于 GO 中的這種情況。那么在這a, b = b, a句話中究竟發生了什么?
uj5u.com熱心網友回復:
a, b = b, a 是一個賦值,更具體地說是一個元組賦值。
Spec: Assignments 中有詳細說明:
元組賦值將多值操作的各個元素分配給變數串列。
[...] 任務分兩個階段進行。首先,左邊的索引運算式和指標間接(包括選擇器中的隱式指標間接)和右邊的運算式的運算元都按通常的順序計算。其次,分配按從左到右的順序進行。
a, b = b, a // exchange a and b
因此,首先讀取b和的(當前)值a,然后將它們分配給a, b,從而有效地交換它們的值。
這個:
x, y := <-c, <-c
是一個簡短的變數宣告,它相當于一個帶有初始化運算式但沒有型別的常規變數宣告:
var x, y = <-c, <-c
這將接收 from c、 兩次,并將接收到的值分配給x和y。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/365600.html
標籤:走
上一篇:取消參考帶有多個反斜杠的字串
