關(guān)于golang中平行賦值淺析
對于golang, 交換兩個(gè)數(shù)很簡單,如下這么寫就可以了:
i, j = j, i
等號左邊和右邊含有多個(gè)表達(dá)式,這就是平行賦值。 賦值分為兩個(gè)步驟:
- 計(jì)算等號左邊的操作數(shù)的索引表達(dá)式和取址表達(dá)式,計(jì)算等號右邊的表達(dá)式。
- 賦值
我們來看下面一段代碼會(huì)輸出什么?
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]。 這是因?yàn)榈忍栕筮叺那衅乃饕磉_(dá)式i-1會(huì)被先計(jì)算,最后才是賦值。 計(jì)算和賦值的順序,都是從左往右。 我們再來看下面的代碼會(huì)輸出什么?
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,前面的也會(huì)被賦值成功。 再看這個(gè)會(huì)輸出什么?
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()
再次理解一下,賦值的第一步,計(jì)算等號左邊的索引表達(dá)式,取址表達(dá)式 和 計(jì)算等號右邊的表達(dá)式。
理解參照了《Go并發(fā)編程一書》
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Mac上Go環(huán)境和VS Code的正確安裝與配置方法
Go語言是一個(gè)新興的語言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個(gè)語言,Go語言提供了mac下安裝包,可直接下載安裝包點(diǎn)擊安裝2018-03-03
Go語言實(shí)現(xiàn)關(guān)閉http請求的方式總結(jié)
面試的時(shí)候問到如何關(guān)閉http請求,一般人脫口而出的是關(guān)閉response.body,這是錯(cuò)誤的。本文為大家整理了三個(gè)正確關(guān)閉http請求的方法,希望對大家有所幫助2023-02-02
golang調(diào)用windows平臺(tái)的dll庫的方法實(shí)現(xiàn)
本文主要介紹了golang調(diào)用windows平臺(tái)的dll庫的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Go語言實(shí)現(xiàn)開發(fā)一個(gè)簡單的gRPC Demo
這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實(shí)現(xiàn)開發(fā)一個(gè)簡單的gRPC Demo,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-07-07

