假设有一个 map 对象 map[string]Person
, 其中 Person
定义如下。是一个 struct
type Person struct {
Age int
}
现在有一个需求, map 中的 Person 对象年龄为 0 , 则将其默认值设置为 18。
很显然, 由于 map[string]Person
中保存的是 值对象 ,因此通过任意方式获取的都是 值对象的副本 , 所有修改都是在副本上, 不能 修改真实值。
如果是 map[string]*Person
就很方便了。 *Person
是 指针对象 , 获取到的是 指针对象的副本, 而 指针副本 也指向了原始数据, 就 可以修改 真实值。
然而, map 本身可以被 被认为 是一个指针对象。因此可以通过 同名 key 赋值覆盖的方式, 实现 修改的效果。
package main
import "fmt"
type Person struct {
Age int
}
func main() {
p1 := Person{Age: 10}
p2 := Person{}
pmap := make(map[string]Person)
pmap["p1"] = p1
pmap["p2"] = p2
for key := range pmap {
p := pmap[key] // 获取值对象
if p.Age == 0 {
p.Age = 18 // 修改
}
pmap[key] = p // 同名 key 赋值覆盖
}
fmt.Println(pmap) // map[p1:{10} p2:{18}]
}
这种虽然方式效率不高, 但是可行。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有