Golang range 的一些坑

先舉個(gè)栗子:

package main

import (
    "fmt"
)

type Foo struct {
    Bar string
}

func main() {
    list := []Foo{Foo{"bar1"}, Foo{"bar2"}, Foo{"bar3"}}
    for i, v := range list {
        v.Bar = "change" + string(i)
    }
    fmt.Println(list)
}

我們期望的結(jié)果是

[{change1} {change2} {change3}]

但是實(shí)際輸出的結(jié)果是

[{test1} {test2} {test3}]

為什么沒有改變? 其實(shí) for range 中的 v 是一個(gè)數(shù)組元素值的拷貝, 而不是數(shù)組元素本身。所以,修改數(shù)組元素需要使用下標(biāo)進(jìn)行修改。栗子中 for range 修改成

for i, _ := range list {
    list[i].Bar = "change" + string(i)
}

小考題:

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3}
    for _, v := range a {
        fmt.Println(&v)
    }
}

上面代碼每次輸出是否是一樣?
答案:是一樣的。
解析:for range 中的 v 只會(huì)聲明初始化一次,不會(huì)每次循環(huán)都聲明初始化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容