记性不好,初学golang,作个笔记。
先看以下代码:
package main
import "fmt"
type student struct {
Name string
Age int
}
func main(){
m := make(map[string]*student)
stus := []student{
{"john", 20},
{"bob", 22},
{"any", 19},
}
for _, s := range stus {
m[s.Name] = &s
}
for k, v := range m {
fmt.Println(k, *v)
}
}
有什么问题吗?映射中的内容会如何
输出如下:
john {any 19}
bob {any 19}
any {any 19}
原因是range时,s的内存地址是不变的,相应的从stus中取出的值依次赋值给s,当写map时,使用的却是s的内存地址。
相当于s是公共地址,stus中的内容都会去使用,最后结果就是哪个最后使用的,s中的内容就是哪个,而map中记录的刚好是s的地址,就出现如上的结果。