map作为Go 语言中常见数据类型广泛的在Go语言中被使用,当使用map时不免需要对map值进行修改。

一般情况下我们可以直接使用赋值的方法来修改map对应key的值。

package main

import "fmt"


func main() {
	t := map[string]string{
		"1":"1",
	}
	t["1"]="2"
	fmt.Println(t["1"])
	
}

运行结果

对于key的值已经被我们修改掉了,但是当key对应的值是结构体时如果我们想直接修改结构体里成员变量的值使用上述方法就会报错

package main

// 无法直接更新 struct 的字段值
type data struct {
    name string
}

func main() {
    m := map[string]data{
        "x": {"baidu"},
    }
    m["x"].name = "zhihu"
}

这是因为map 中的元素是不可寻址的。由于map 会进行动态扩容,当进行扩展后,map的value就会进行内存迁移,其地址发生变化,因此没法对这个value进行寻址

这时候我们可以利用局部变量来完成修改

package main

import "fmt"

type data struct {
    name string
}

func main() {
    m := map[string]data{
        "x": {"baidu"},
    }
    r := m["x"]
    r.name = "zhihu"
    m["x"] = r
    fmt.Println(m)   
}

或者在定义map数据的时候使用结构体指针,因为存的是结构体的地址所以这个时候我们自然也就能修改结构体的值了。

package main

// 无法直接更新 struct 的字段值
type data struct {
    name string
}

func main() {
    m := map[string]*data{
        "x": {"baidu"},
    }
    m["x"].name = "zhihu"
}

这样我们就完成了修改map字段的值是 struct 类型的值