Go語言的中的For循環(huán)之大坑
For循環(huán)在我們?nèi)粘>幋a中可能用的很多。在很多業(yè)務(wù)場景中我們都需要用for循環(huán)處理。但golang中的for循環(huán)有一個大大大的坑,大家可否遇到。直接上代碼:

我們寫一個測試類,定義一個切片數(shù)組,然后循環(huán)迭代每個元素,將元素的值放到另一個切片。循環(huán)finalArrays的時候按照我們的預(yù)期應(yīng)該輸出1、2、3、4。但事與愿違,輸出的結(jié)果如下圖:

懵逼了吧!為什么會出現(xiàn)這種奇怪的現(xiàn)象呢?這就是golang的循環(huán)變量的作用域?qū)е碌摹?/p>
在golang的for循環(huán)中,循環(huán)內(nèi)部創(chuàng)建的函數(shù)變量都是共享同一塊內(nèi)存地址,for循環(huán)總是使用同一塊內(nèi)存去接收循環(huán)中的的value變量的值。不管循環(huán)多少次,value的內(nèi)存地址都是相同的。事實確實如此,我們輸出value的內(nèi)存地址看下:

所以,可以看到,整個4次循環(huán)過程中,所有變量值都是在0xc0000b8780這個地址上迭代的。4次循環(huán)都指向的是同一塊內(nèi)存地址,最后一次賦值的操作變量的值是4,指向了這塊內(nèi)存地址,所以前三次的值都變成了4。那我們怎么優(yōu)化呢?我們只需要定義臨時變量。

我們定義一個臨時變量tmp,將value的值賦給tmp,問題就解決了。
評論中很多同學(xué)說,例子不足以說明這個問題,我這里寫一段我們實際業(yè)務(wù)場景的代碼,大家看看。

Bid結(jié)構(gòu)體中的屬性我就不貼圖了。這種情況很多新手同學(xué)會犯,尤其是從java轉(zhuǎn)go的同學(xué)。