Go中for range的時候,地址是否發生變化

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章