一架梯子,一头程序猿,仰望星空!
Golang高级特性面试题 > 内容正文

Go map 的值不可寻址,那如何修改值的属性?


问题简答

map的value类型使用指针类型,即可直接通过map修改value的属性。

问题详解:

golang里面的map,当通过key获取到value时,这个value是不可寻址的,因为map 会进行动态扩容,当进行扩展后,map的value就会进行内存迁移,其地址发生变化,所以无法对这个value进行寻址。

错误例子:

package main
import "fmt"
type UserInfo struct {
    Uid      string `json:"uid"`
    UserName string `json:"user_name"`
    Sex      int    `json:"sex"`
}

func main() {
    var user = make(map[string]UserInfo)
    uid := "0001"
    user[uid] = UserInfo{
        Uid:      uid,
        UserName: "jack",
        Sex:      1,
    }
    user[uid].UserName="polly"
    fmt.Println(user[uid])
}

代码运行报错:cannot assign to struct field user[uid].UserName in map

无法修改map指向的结构体属性。

解决方案:
map的value类型,如果是结构体类型,可以使用指针类型。

package main
import "fmt"
type UserInfo struct {
    Uid      string `json:"uid"`
    UserName string `json:"user_name"`
    Sex      int    `json:"sex"`
}
func main() {
    // map value类型使用指针类型
    var user = make(map[string]*UserInfo)
    uid := "0001"
    user[uid] = &UserInfo{
        Uid:      uid,
        UserName: "jack",
        Sex:      1,
    }
    // 因为value类型是指针类型,可以直接修改结构体属性
    user[uid].UserName="polly"
    fmt.Println(user[uid])
}