for range遍历时的地址不变问题
现有结构体:
type Customer struct {
id int
name string
age int
}
对其进行遍历
func main() {
var customerData []Customer
customerData = append(customerData, Customer{id: 1, name: "a", age: 10})
customerData = append(customerData, Customer{id: 2, name: "b", age: 20})
customerData = append(customerData, Customer{id: 3, name: "c", age: 30})
for _, item := range customerData {
fmt.Println("id: ", item.id)
fmt.Printf("item地址:%p\n", &item)
fmt.Println("item值:", item)
fmt.Println("------------")
}
}
我理解是因为在开始for range遍历时,会创建一个item对象,因为只在开始时创建,所以地址是固定的,当遍历时,只是将遍历到的数据传递进item里。所以会出现如果打印item的值,那么是变化的,而如果打印地址,则会发现地址不变的情况。
要想在循环里获取到每一个item对象的地址,比如转成map[int]*Customer
的形式,那需要在在循环中把item赋给一个新的对象,然后用新的对象来操作,如:
func main() {
var customerData []Customer
customerData = append(customerData, Customer{id: 1, name: "a", age: 10})
customerData = append(customerData, Customer{id: 2, name: "b", age: 20})
customerData = append(customerData, Customer{id: 3, name: "c", age: 30})
var customerDataMap map[int]*Customer
for _, item := range customerData {
newItem := item
customerDataMap[item.id] = &newItem
fmt.Printf("新item地址:%p\n", &newItem )
fmt.Println("新item值:", newItem )
fmt.Println("================")
}
}