0

0

Go 中操作 map 时为何不需要传递指针?

碧海醫心

碧海醫心

发布时间:2026-01-17 23:17:02

|

307人浏览过

|

来源于php中文网

原创

Go 中操作 map 时为何不需要传递指针?

go 中的 map 本身是引用类型,直接传值即可修改其内容,无需使用指针;若需修改 map 中元素的字段,应让 map 的 value 类型为指针(如 map[string]*session),而非对 map 本身取地址。

在 Go 中,map 是引用类型(reference type),其底层实现包含一个指向哈希表结构的指针。这意味着:当你将 map 作为参数传递给函数时,实际上传递的是该引用的副本(即指针的拷贝),函数内部对 map 的增、删、改(如 delete、m[key] = val)会直接影响原始 map —— *无需使用 `map[K]V` 指针类型**。

因此,你原代码中的错误:

func refreshSession(sessions *map[string]Session) {
    for sid := range *sessions {
        if now.After((*sessions)[sid].timestamp.Add(sessionRefresh)) { // ❌ 编译失败
            delete(*sessions, sid)
        }
    }
}

不仅冗余,而且语法非法:*sessions 解引用后得到一个 map[string]Session 类型值,但 (*sessions)[sid] 尝试对 *map[string]Session 类型(即指针)做索引,Go 不允许对指针类型直接下标访问。

京点点
京点点

京东AIGC内容生成平台

下载

✅ 正确写法是直接传递 map 值,并确保 value 可被修改:

// 推荐:value 使用指针,以便修改 Session 内部字段(如 timestamp)
func refreshSession(sessions map[string]*Session) {
    now := time.Now()
    for sid, sess := range sessions {
        // 直接通过 sess 指针修改其字段,或调用方法
        if now.After(sess.timestamp.Add(sessionRefresh)) {
            delete(sessions, sid)
        }
    }
}

⚠️ 注意事项:

  • 若 Session 是值类型(如 struct{ timestamp time.Time }),且你仅需读取字段(不修改),map[string]Session 也可工作,但每次遍历时 sess 是副本,修改它不会影响 map 中原始值;
  • 若要修改 Session 的字段(例如重置 timestamp),必须使用 map[string]*Session,否则修改的是循环变量的副本;
  • delete(map, key) 和 map[key] = val 等操作在 map[string]V 或 map[string]*V 上均可直接使用,无需解引用 map 本身;
  • 对 map 取地址(&m)仅在极少数场景有用(如需交换整个 map 变量的引用),日常增删改查完全不需要。

? 总结:
不要写 *map[K]V —— 这是常见误区;
要修改 value 的字段?用 map[K]*V;
只需遍历或删除键?用 map[K]V 即可;
Go 的 map、slice、chan、func、interface 都是引用类型,传值即够用。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

308

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

740

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

33

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

59

2025.11.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号