0

0

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

心靈之曲

心靈之曲

发布时间:2026-01-17 22:57:08

|

586人浏览过

|

来源于php中文网

原创

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

go 中的 map 本身就是引用类型,直接传值即可修改其内容;使用 `*map[k]v` 不仅多余,还会导致编译错误(如索引非法),正确做法是传 `map[string]session` 并在函数内直接操作。

在 Go 中,map 是引用类型(reference type),这一点与 slice、channel 相同——它们底层都持有指向底层数据结构的指针。因此,当你将一个 map 作为参数传递给函数时,实际上传递的是该引用的副本(即指针的拷贝),函数内部对 map 元素的增删改(如 m[key] = value、delete(m, key))会直接影响原始 map,*无需也不应使用指针类型 `map[K]V`**。

你遇到的编译错误:

invalid operation: sessions[sid] (type *map[string]Session does not support indexing)

正是因为 sessions 被声明为 *map[string]Session(指向 map 的指针),而 Go 不允许对指针类型直接进行索引操作。你必须先解引用(*sessions)得到 map 值,再索引——但此时 (*sessions)[sid] 的语法虽合法,却会触发另一个问题:*sessions[sid].timestamp 实际被解析为 (*sessions[sid]).timestamp(因运算符优先级),而 sessions[sid] 在解引用前根本无法索引,导致逻辑混乱且不可读。

✅ 正确写法(推荐):直接传 map 值

京点点
京点点

京东AIGC内容生成平台

下载
func refreshSession(sessions map[string]Session) {
    now := time.Now()
    for sid := range sessions {
        // 注意:Session 必须是可寻址类型才能调用方法(如 .timestamp.Add)
        // 若 Session 是值类型且 timestamp 是 time.Time 字段,则以下写法合法
        if now.After(sessions[sid].timestamp.Add(sessionRefresh)) {
            delete(sessions, sid)
        }
    }
}

⚠️ 注意事项:

  • 如果 Session 结构体较大,且你仅需读取字段而不修改,传 map[string]Session 无性能问题(map 本身小,只复制头信息);
  • 如果你需要在循环中修改 Session 的字段(例如更新 sessions[sid].lastAccess),则应使用 map[string]*Session,确保获取到可寻址的指针:
    func refreshSession(sessions map[string]*Session) {
        now := time.Now()
        for sid, s := range sessions {
            if now.After(s.timestamp.Add(sessionRefresh)) {
                delete(sessions, sid)
            }
        }
    }
  • 绝对避免 *map[string]Session:它既增加复杂度,又丧失 map 的天然引用优势,还易引发编译错误和语义误解。

? 总结:Go 的 map 设计初衷就是“轻量引用”,牢记口诀——“传 map,不加星;要改值,存指针”(即 map 本身不加 *,若需修改元素内部字段,让 map 的 value 类型为指针)。

相关专题

更多
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

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

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

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

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号