For循環在我們日常編碼中可能用的很多。在很多業務場景中我們都需要用for循環處理。但golang中的for循環有一個大大大的坑,大家可否遇到。直接上代碼:
我們寫一個測試類,定義一個切片數組,然後循環迭代每個元素,將元素的值放到另一個切片。循環finalArrays的時候按照我們的預期應該輸出1、2、3、4。但事與願違,輸出的結果如下圖:
懵逼了吧!為什麼會出現這種奇怪的現象呢?這就是golang的循環變量的作用域導致的。
在golang的for循環中,循環內部創建的函數變量都是共享同一塊內存地址,for循環總是使用同一塊內存去接收循環中的的value變量的值。不管循環多少次,value的內存地址都是相同的。事實確實如此,我們輸出value的內存地址看下:
所以,可以看到,整個4次循環過程中,所有變量值都是在0xc0000b8780這個地址上迭代的。4次循環都指向的是同一塊內存地址,最後一次賦值的操作變量的值是4,指向了這塊內存地址,所以前三次的值都變成了4。那我們怎麼優化呢?我們只需要定義臨時變量。
我們定義一個臨時變量tmp,將value的值賦給tmp,問題就解決了。
評論中很多同學說,例子不足以說明這個問題,我這裡寫一段我們實際業務場景的代碼,大家看看。
Bid結構體中的屬性我就不貼圖了。這種情況很多新手同學會犯,尤其是從java轉go的同學。
閱讀更多 阿邁達聊技術 的文章