原本想在一個for里面創建10個協程,這些協程順序拿到for的遞增變量,把這10個遞增變量都打印出來。但事與願違,於是做實驗,查書,思考,寫出以下記錄。
golang里,在for循環里面起協程,如下代碼。會輸出for循環的最后一個數,或者參雜有不確定的其他數字。



原因有二:1,golang是值拷貝傳遞;2,for循環很快就執行完了,但是創建的10個協程需要做初始化:上下文准備,堆棧,和內核態的線程映射關系的工作,是需要時間的,比for慢,等都准備好了的時候,會同時訪問變量temp 。這個時候的temp肯定是for執行完成后的數字10。所以10個協程都打印10。(也可能有個別的協程已經准備好了,取temp的時候,正好是5,或者7,就輸出了這些數字)
破解的方法就是閉包,給匿名函數增加入參,因為是值傳遞,所以每次for創建一個協程的時候,會拷貝一份temp傳到這個協程里面去,這樣就可以實現0-9的數字打印了。修改后的代碼和實驗結果也在下面。


