我們會經常性的使用如下片段
for k, v :=
range sli
來看下面的例子
func
main()
wg := sync.waitgroup
for k, v :=
range sli ()
} wg.
wait()
}
列印輸出
8 9
8 98 9
8 98 9
8 98 9
8 98 9
結果和想象的不一樣,主要原因出在協程這裡,如果不使用協程,而是使用序列的方式,結果結合預期一致,比如
func
main()
for k, v :=
range sli ()
}}
列印輸出
0 1
1 22 3
3 44 5
5 66 7
7 88 9
其中 k, v 是迭代變數,每次迭代都會給 k, v 賦值新的值,並且多個協程又同時呼叫了 k, v ,所以結果就串了,解決方式就是定義乙個區域性變數。
func
main()
wg := sync.waitgroup
for k, v :=
range sli ()
} wg.
wait()
}
列印輸出
4 5
1 22 3
8 97 8
5 66 7
0 13 4
k1, v1 是區域性變數
,每次迴圈,迴圈體內是不共享的,這也是為什麼可以這樣宣告變數(k1 := k
)。
或者通過傳參的方式來固定下來
func
main()
wg := sync.waitgroup
for k, v :=
range sli
)(k, v)
} wg.
wait()
}
GoLang協程和管道
1.1 8000查詢素數的例子 package main import fmt 向intchan放入1 8000個數 func putnum intchan chan int 關閉intchan close intchan 從 intchan 取出資料,並且判斷是否為素數,如果是,就放入到prime...
關於協程 nodejs和golang協程的不同
nodejs和golang都是支援協程的,從表現上來看,nodejs對於協程的支援在於async await,golang對協程的支援在於goroutine。關於協程的話題,簡單來說,可以看作是非搶占式的輕量級執行緒。一句話概括,上面提到了 可以看作是非搶占式的輕量級執行緒 在多執行緒中,把一段 放...
全域性變數 變數 區域性變數和全域性變數
在python中,變數是表示 或指向 特定值的名稱。例如,我們可能想使用名稱a來表示2,為此執行下列 這稱為賦值 assignment 將值2賦給了變數a。也就是變數a與值 或物件 2關聯起來。給變數賦值後,就可以在表示式中使用它。例如 注意 在使用python變數前,必須先給它賦值,而且,變數名稱...