溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于golang中平行賦值淺析

發(fā)布時間:2020-10-18 07:26:31 來源:腳本之家 閱讀:120 作者:jmycanfly 欄目:編程語言

對于golang, 交換兩個數(shù)很簡單,如下這么寫就可以了:

i, j = j, i

等號左邊和右邊含有多個表達(dá)式,這就是平行賦值。 賦值分為兩個步驟:

  • 計算等號左邊的操作數(shù)的索引表達(dá)式和取址表達(dá)式,計算等號右邊的表達(dá)式。
  • 賦值

我們來看下面一段代碼會輸出什么?

func main() {
 i := 1
 s := []string{"A", "B", "C"}
 i, s[i-1] = 2, "Z"
 fmt.Printf("s: %v \n", s)
}

這里輸出的 s: [Z,B,C] 而不是s: [A,Z,C]。 這是因為等號左邊的切片的索引表達(dá)式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 range

goroutine 1 [running]:

在賦值的過程中,即使后面的引發(fā)了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 range

goroutine 1 [running]:
main.main()

再次理解一下,賦值的第一步,計算等號左邊的索引表達(dá)式,取址表達(dá)式 和 計算等號右邊的表達(dá)式。

理解參照了《Go并發(fā)編程一書》

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI