package main

import "fmt"

type Employee struct {
	Name string
	Id int
}

func main()  {
	employeeMap := map[string]*Employee{}
	workers := []Employee{
		{"a", 1},
		{"b",2},
	}
	for _, worker := range workers{
		employeeMap[worker.Name] = &worker
	}

	fmt.Printf("%+v", employeeMap)
}
输出的结果:
map[a:0xc00000a060 b:0xc00000a060]

可以看出,map中的值指向了同一个地址,因为for range创建了每个元素的副本,而不是直接返回每个元素的引用,如果使用该值变量的地址作为指向每个元素的指针,就会导致错误,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以值的地址总是相同的,导致结果不如预期。

做一下小小的修改就能得到我们的预期结果:

 
package main

import "fmt"

type Employee struct {
	Name string
	Id int
}

func main()  {
	employeeMap := map[string]*Employee{}
	workers := []Employee{
		{"a", 1},
		{"b",2},
	}
	for _, worker := range workers{
		w:= worker
		employeeMap[worker.Name] = &w
	}

	fmt.Printf("%+v", employeeMap)
}
输出的结果:
map[a:0xc00000a060 b:0xc00000a080]

发表评论