Golang Map中value是不可寻址,可使用指针类型代替

Posted Peanut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang Map中value是不可寻址,可使用指针类型代替相关的知识,希望对你有一定的参考价值。

Golang Map元素取址:

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])
}

以上代码报错:./map.go:19:20: cannot assign to struct field user[uid].UserName in map
原因是 map 元素是无法取址的,也就说可以得到 user[uid].UserName, 但是无法对其进行修改。
解决办法:使用指针的map
golang里面的map,当通过key获取到value时,这个value是不可寻址的,因为map 会进行动态扩容,当进行扩展后,map的value就会进行内存迁移,其地址发生变化,所以无法对这个value进行寻址。也就是造成上述问题的原因所在。map的扩容与slice不同,那么map本身是引用类型,作为形参或返回参数的时候,传递的是值的拷贝,而值是地址,扩容时也不会改变这个地址。而slice的扩容,会导致地址的变化。

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])
}

以上是关于Golang Map中value是不可寻址,可使用指针类型代替的主要内容,如果未能解决你的问题,请参考以下文章

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

golang---map类型

golang---map类型

Golang 所有的 T 类型都有 *T 类型吗?

Golang 所有的 T 类型都有 *T 类型吗?

golang 中的指针