0

0

Go 中操作 map 时无需传递指针:理解 map 的引用语义

霞舞

霞舞

发布时间:2026-01-17 22:56:06

|

325人浏览过

|

来源于php中文网

原创

Go 中操作 map 时无需传递指针:理解 map 的引用语义

go 中的 map 本身是引用类型,直接传值即可修改其内容;传递 *map[string]t 反而会导致编译错误,因为指针不支持索引操作。正确做法是传 map 值,并在需要修改元素内部字段时,将 map 元素设为指针(如 map[string]*session)。

在 Go 中,map 是内置的引用类型(reference type),其行为类似于 slice、chan 和 func —— 它们底层都持有一个指向底层数据结构(如 hash table)的指针。因此,当你将一个 map 作为参数传递给函数时,实际上传递的是该引用的副本,但该副本仍指向同一底层数据结构。这意味着你*无需使用 `map[K]V` 指针类型**即可安全地增删改查 map 内容。

回到你的原始代码:

func refreshSession(sessions *map[string]Session) {
    now := time.Now()
    for sid := range *sessions {
        if now.After((*sessions)[sid].timestamp.Add(sessionRefresh)) { // ❌ 编译错误:*map 不支持索引
            delete(*sessions, sid)
        }
    }
}

这段代码报错的根本原因在于:*sessions 是一个指向 map 的指针(类型为 *map[string]Session),而 Go 不允许对指针类型做索引操作(即 ptr[key] 语法非法)。即使你解引用 (*sessions)[sid],Go 编译器仍会拒绝——因为 (*sessions) 是一个 map 类型的值,但括号和运算符优先级导致语法解析失败(更准确地说,*sessions[sid] 被解析为 *(sessions[sid]),而 sessions[sid] 本身非法)。

✅ 正确写法是直接传递 map 值,并按需调整 map 元素类型:

京点点
京点点

京东AIGC内容生成平台

下载
// 推荐:传 map 值,且 Session 字段需可变时,用 *Session
func refreshSession(sessions map[string]*Session) {
    now := time.Now()
    for sid, sess := range sessions {
        // 注意:sess 是 *Session,可直接修改其字段
        if now.After(sess.timestamp.Add(sessionRefresh)) {
            delete(sessions, sid)
        }
    }
}

⚠️ 关键注意事项:

  • 若 Session 是值类型(如 struct),且你仅需读取字段(如 sess.timestamp),则 map[string]Session 也可工作,但 delete 和 range 仍完全有效;
  • 但若需修改 session 内部字段(例如更新 sess.lastAccess),必须使用 map[string]*Session,否则 sess 是副本,修改无效;
  • 绝对避免 *map[string]T:它既无必要,又引入复杂语法、降低可读性,还易引发编译错误;
  • delete() 和 len() 等操作均作用于 map 值本身,与是否为指针无关。

? 总结:Go map 天然支持“按引用修改”,设计接口时应遵循 idiomatic Go 风格——简洁、直接、少用冗余指针。只需记住一句话:*“map is reference; map is not idiomatic.”**

相关专题

更多
string转int
string转int

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

318

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

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

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

534

2023.12.01

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

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

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号