package main

const N = 3

func main() {
	m := make(map[int]*int)

	for i := 0; i < N; i++ {
		m[i] = &i //A
	}

	for _, v := range m {
		print(*v)
	}
}

结果是

333

原因是

  • 循环的 k,v 的地址在循环的时候是不变的
  • 循环内声明的变量,每次都是不一样的
  • 存 k 和 v 的地址并不会计算出来然后存起来,而是存的「k 和 v 的地址」这个概念,所以最后所有的值指向的都是最后一次循环的地址

所以重点就是 i 每次都是那个 i,p 每次都不是那个 p(作用域知识)

所以需要在循环内部申请局部变量存 i,然后把他的地址赋给 map

package main

const N = 3

func main() {
	m := make(map[int]*int)

	for i := 0; i < N; i++ {
		p := i
		m[i] = &p //A
	}

	for _, v := range m {
		print(*v)
	}
}

参考