golang 平行賦值探討
來源:互聯網
上載者:User
對於golang, 交換兩個數很簡單,如下這麼寫就可以了:```i, j = j, i```等號左邊和右邊含有多個運算式,這就是平行賦值。賦值分為兩個步驟: 1. 計算等號左邊的運算元的索引運算式和取址運算式,計算等號右邊的運算式。 2. 賦值 我們來看下面一段代碼會輸出什嗎? ```func main() {i := 1s := []string{"A", "B", "C"}i, s[i-1] = 2, "Z"fmt.Printf("s: %v \n", s)}```這裡輸出的 s: [Z,B,C] 而不是s: [A,Z,C]。 這是因為等號左邊的切片的索引運算式i-1會被先計算,最後才是賦值。計算和賦值的順序,都是從左往右。我們再來看下面的代碼會輸出什嗎?```func main() {a := []int{1, 2, 3, 4}defer func(a []int) {fmt.Printf("a: %v\n", a)}(a)a[0], a[4] = a[1], a[2]}```輸出的是:```a: [2 2 3 4]panic: runtime error: index out of rangegoroutine 1 [running]:```在賦值的過程中,即使後面的引發了panic,前面的也會被賦值成功。再看這個會輸出什嗎?```func main() {a := []int{1, 2, 3, 4}defer func(a []int) {fmt.Printf("a: %v\n", a)}(a)a[0], a[1] = a[2], a[4]}```輸出的是:```a: [1 2 3 4]panic: runtime error: index out of rangegoroutine 1 [running]:main.main()```再次理解一下,賦值的第一步,計算等號左邊的索引運算式,取址運算式 和 計算等號右邊的運算式。理解參照了《Go並發編程一書》91 次點擊