0

0

如何在 Go 中通过指针修改映射(map)中结构体对象的字段值

聖光之護

聖光之護

发布时间:2026-01-26 08:38:03

|

665人浏览过

|

来源于php中文网

原创

如何在 Go 中通过指针修改映射(map)中结构体对象的字段值

go 中遍历 map 时,`range` 循环中的变量是值拷贝,直接对其取地址传参无法修改原 map 中的数据;必须通过 map 的键显式读取、修改并写回,才能持久化变更。

Go 是一门值语义语言:当使用 for _, v := range myMap 遍历时,v 是 map 中对应 value 的一份独立副本(即使该 value 是结构体或指针类型,其本身仍被复制)。因此,对 &v 取地址并传入函数修改,只会影响这个临时副本,而不会反映到原始 map 中。

✅ 正确做法:通过键访问并显式赋值

type Track struct {
    Name string
    ID   int
}

func Working(t *Track, c *chan bool) {
    t.Name = "Modified_" + t.Name // 修改字段
    // 注意:此处仅修改了 *t 指向的内存,但若 t 来自副本,则无效
}

// 假设 tracks 是 map[string]Track
tracks := map[string]Track{
    "t1": {Name: "Song A", ID: 1},
    "t2": {Name: "Song B", ID: 2},
}

// ❌ 错误:track 是副本,&track 无法影响原 map
for _, track := range tracks {
    Working(&track, nil)
}
// 此时 tracks 中所有 Name 保持不变

// ✅ 正确:用 key 索引原 map,读-改-写
for key := range tracks {
    t := tracks[key]        // 显式复制一份用于修改(安全且明确)
    Working(&t, nil)        // 修改副本 t 的字段
    tracks[key] = t         // 将修改后的值写回 map —— 关键步骤!
}
? 补充说明:如果 tracks 的 value 类型本就是指针(如 map[string]*Track),则可直接 Working(tracks[key], nil),无需中间变量和写回操作——因为此时 tracks[key] 本身就是指向堆上同一对象的指针。

⚠️ 注意事项

  • 不要依赖 range 循环变量的地址来修改容器内容,这是 Go 初学者常见误区;
  • 若 map value 是大结构体,频繁读-改-写可能带来性能开销,此时建议直接使用 map[key]*Struct 设计;
  • 使用 go vet 或静态分析工具(如 staticcheck)可帮助识别“取循环变量地址”这类潜在错误。

? 推荐学习资源

  • 官方文档:Effective Go – Pointers
  • 经典书籍:《The Go Programming Language》(Alan A. A. Donovan & Brian W. Kernighan),第 2、4、7 章深入讲解值/引用语义与复合类型行为;
  • 实践平台:A Tour of Go(免费交互式教程)+ Go Playground 快速验证概念。

掌握 Go 的值传递本质,是写出健壮、可预测代码的关键一步。

Artifact News
Artifact News

由AI驱动的个性化新闻推送

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

401

2023.08.02

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

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

220

2025.06.09

golang结构体方法
golang结构体方法

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

190

2025.07.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

108

2024.02.23

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

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

75

2025.09.05

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

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

36

2025.11.16

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

0

2026.01.26

热门下载

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

精品课程

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

共32课时 | 4.2万人学习

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号