map元素的数据类型为结构体时的注意事项

package main

import "fmt"

type Human struct {
   Name string
   Age  int64
}

func main() {
   m := make(map[string]Human)
   m["hum"] = Human{Name: "张三", Age: 18}

   //========== 实现修改Age字段值 ==========//
   
   // 下面的代码是错误的(无法通过编译)
   // m["hum"].Age = 22
   fmt.Printf("俺叫%+v,今年%+v岁。\n", m["hum"].Name, m["hum"].Age) // 俺叫张三,今年18岁。

   // 要实现修改Age字段值只能把map元素整个替换掉
   tmp, ok := m["hum"]
   if ok {
      tmp.Age = 22
      m["hum"] = tmp
   }
   fmt.Printf("俺叫%+v,今年%+v岁。\n", m["hum"].Name, m["hum"].Age) // 俺叫张三,今年22岁。
}

  最佳的实现方案是map元素保存结构体指针,而不是结构体本身,代码如下:

package main

import "fmt"

type Human struct {
   Name string
   Age  int64
}

func main() {
   m := make(map[string]*Human)
   m["hum"] = &Human{Name: "张三", Age: 18}

   // m["hum"].Age = 22 // 语法糖写法【不推荐】
   (*m["hum"]).Age = 22 // 标准写法  【推荐】

   fmt.Printf("俺叫%+v,今年%+v岁。\n", m["hum"].Name, m["hum"].Age) // 俺叫张三,今年22岁。
}

Copyright © 2024 码农人生. All Rights Reserved