前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >map中的值对象虽然不能修改,但是可以替换

map中的值对象虽然不能修改,但是可以替换

作者头像
老麦
发布2022-12-24 09:41:14
3K0
发布2022-12-24 09:41:14
举报
文章被收录于专栏:Go与云原生Go与云原生

值对象与指针对象

假设有一个 map 对象 map[string]Person , 其中 Person 定义如下。是一个 struct

代码语言:javascript
复制
type Person struct {
	Age int
}

现在有一个需求, map 中的 Person 对象年龄为 0 , 则将其默认值设置为 18。

很显然, 由于 map[string]Person 中保存的是 值对象 ,因此通过任意方式获取的都是 值对象的副本 , 所有修改都是在副本上, 不能 修改真实值。

如果是 map[string]*Person 就很方便了。 *Person 是 指针对象 , 获取到的是 指针对象的副本, 而 指针副本 也指向了原始数据, 就 可以修改 真实值。

虽然不能被修改, 但是能被覆盖

然而, map 本身可以被 被认为 是一个指针对象。因此可以通过 同名 key 赋值覆盖的方式, 实现 修改的效果。

代码语言:javascript
复制
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}]
  
}

这种虽然方式效率不高, 但是可行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 值对象与指针对象
  • 虽然不能被修改, 但是能被覆盖
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档