Go语言中更新map字段值的方式及需注意的点
1.map 中的元素是不可寻址的
如果 map 一个字段的值是 struct 类型,则无法直接更新该 struct 的单个字段
// 无法直接更新 struct 的字段值
type data struct {
name string
}
func main() {
m := map[string]data{
"x": {"Tom"},
}
m["x"].name = "Jerry"
}
2.slice 的元素可寻址
type data struct {
name string
}
func main() {
s := []data{{"Tom"}}
s[0].name = "Jerry"
fmt.Println(s) // [{Jerry}]
}
当然还是有更新 map 中 struct 元素的字段值的方法,有如下 2 个:
使用局部变量
最值直接用赋值的方式来进行处理
// 提取整个 struct 到局部变量中,修改字段值后再整个赋值
type data struct {
name string
}
func main() {
m := map[string]data{
"x": {"Tom"},
}
r := m["x"]
r.name = "Jerry"
m["x"] = r
fmt.Println(m) // map[x:{Jerry}]
}
使用指向元素的 map 指针
使用的直接就是指针,无须寻址
func main() {
m := map[string]*data{
"x": {"Tom"},
}
m["x"].name = "Jerry" // 直接修改 m["x"] 中的字段
fmt.Println(m["x"]) // &{Jerry}
}
但是要注意下边这种误用:
出现如下问题是以内 m [“z”] 并没有给他开辟响应的 data 结构体的内存,因此会出现内存泄露的问题
func main() {
m := map[string]*data{
"x": {"Tom"},
}
m["z"].name = "what???"
fmt.Println(m["x"])
}
更多go语言的注意点,请收藏本站网址:https://www.zongscan.com/
相关文章