golang協程注意全域性變數和區域性變數

2021-10-24 22:48:39 字數 1168 閱讀 7865

我們會經常性的使用如下片段

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變數前,必須先給它賦值,而且,變數名稱...