Go语言中更新map字段值的方式及需注意的点

2023-06-01 00:00:00 字段 语言 需注意

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/


相关文章