1、当map遇到结构体

package main

import "fmt"

func main() {
    type user struct {
        name string
    }
    m := map[int]user{
        1: {"Tom"},
    }
    //fmt.Println(&m)
    m[2] = user{"Jerry"}
    //m[2].name = "Sam"    非法,正确做法如下
    //1、替换value
    tmp := m[2]      //先把value拿到
    tmp.name = "sam" //修改struct的字段的值
    m[2] = tmp       //修改map中的成员
    //2、使用指针
    m2 := map[int]*user{
        1: &user{"Tom"},
    }
    m2[1].name = "Jack" //通过指针修改
    fmt.Println(m[1])
    //fmt.Println(&m)
}

由上面例子发现:

  • &m无法取到地址的值
  • 查询资料可知,map在扩张重新哈希后,各键值项存储位置会发生变化
  • 因此,map被设计成不可寻址的模式,在上面代码块中,m[2].name是非法的。
  • 正确姿势应该是完整替换 value 或者使用 指针 ,如下所示