1,回答問題之前,先看下面這段代碼
package main
import "fmt"
type girl struct {
Name string
Age int
}
func main() {
gl := make(map[string]*girl)
studs := []girl{
{Name: "Lili", Age: 23},
{Name: "Lucy", Age: 24},
{Name: "Han Mei", Age: 21},
}
for _, v := range studs {
gl[v.Name] = &v
}
for mk, mv := range gl {
fmt.Println(mk, "=>", mv.Age)
}
}
2,編譯的結果
Lili => 21
Lucy => 21
Han Mei => 21
3,分析原因
從結果可得知,for range的時候,地址並沒有發生變化。在循環時,會創建一個變量,每次都會把地址賦給同一個變量,導致循環結束後,拷貝的是最後一個。請看下圖:
for _, v := range studs {
gl[v.Name] = &v
fmt.Printf("%s addr: %v\n", v.Name, &v.Age)
}
Lili addr: 0xc0000a4028
Lucy addr: 0xc0000a4028
Han Mei addr: 0xc0000a4028
4,解決問題
在每次循環時,創建一個臨時變量,請看下圖
for _, v := range studs {
temp := v
gl[v.Name] = &temp
}
Lili => 23
Lucy => 24
Han Mei => 21
5,總結
go中for range的時候,地址沒有發生變化
————————————————
版權聲明:本文爲CSDN博主「會飛的code」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/guzimou2/article/details/123289117