map no addressable 不能直接修改value成员
func main() {
m := map[string]struct {
Name string
Age int
}{
"wss": {"wss", 24},
}
m["wss"].Age = 10 // Error: cannot assign to struct field m["wss"].Age in map
fmt.Println(m["wss"])
}
map中value的地址在扩容时有可能会发生变化。 当value值为struct的时候,不能通过.来操作结构体的值。
解决方式:
func main() {
m := map[string]*struct {
Name string
Age int
}{
"wss": {"wss", 24},
}
m["wss"].Age = 10
fmt.Println(m["wss"])
}
// Output:
&{wss 10}
ps: 使用方法来修改结构体中的值也是行不通的。不能获取到value的地址。
m[key]++ 相当于 m[key] = m[key] + 1, 操作是合法的。
map 使用
- 在创建时预先分配足够的空间有利于提升性能,减少扩张时的内存分配和重新hash操作。
- 对于海量小对象, 应直接使用字典存储键值数据拷贝,而非指针。这有利于减少需要扫描的* 对象数量,大幅度缩短垃圾回收的时间。
- 字典不会收缩内存,所以适当替换成新对象是有必要的。