如何在 Go 中正确获取切片中结构体元素的指针

发布时间 - 2026-01-21 00:00:00    点击率:

在 go 中,使用 range 遍历切片时,`value` 是每次迭代的副本变量,对其取地址(&value)得到的是同一个栈变量的地址,而非原切片元素的地址;要获取真实元素指针,必须使用 `&slice[index]`。

Go 的 range 循环在遍历切片时,会将每个元素复制到一个复用的局部变量中(即 value),该变量在整个循环生命周期内内存地址不变。因此,&value 始终指向同一块栈内存,导致所有打印出的指针值相同——这并非 bug,而是 Go 语言明确规定的语义。

要真正获取切片中每个结构体元素的地址,必须显式通过索引访问原底层数组:

package main

import "fmt"

type demo struct {
    name string
}

func main() {
    demoSlice := make([]demo, 3)
    demoSlice[0] = demo{"str1"}
    

demoSlice[1] = demo{"str2"} demoSlice[2] = demo{"str3"} pointSlice := make([]*demo, 3) for index := range demoSlice { fmt.Printf("{%s}==++++++++++++++%p\n", demoSlice[index], &demoSlice[index]) pointSlice[index] = &demoSlice[index] } // 验证指针有效性 for i, p := range pointSlice { fmt.Printf("pointSlice[%d] -> %+v (address: %p)\n", i, *p, p) } }

运行结果将显示三个不同且连续的内存地址(如 0x...e0, 0x...e8, 0x...f0),对应切片底层数组中各 demo 实例的真实位置。

⚠️ 注意事项:

  • 不要对 range 的 value 取地址并保存(如 &value),它仅在当前迭代有效,且始终是同一地址;
  • 若需构建指针切片,优先使用 for i := range slice 或 for i := 0; i
  • 对于大结构体,直接取地址可避免不必要的拷贝,提升性能;
  • 若切片后续可能发生扩容(如 append),原有元素地址可能失效——此时指针将悬空,需谨慎管理生命周期。

总结:Go 中“获取切片元素指针”的本质,是获取底层数组中对应索引位置的地址。牢记 range value 是副本,而 &slice[i] 才是真相。


# go  # app  #   # ai  # for  # 局部变量  # 结构体  # 循环  # 指针  # 切片  # len  # append  # bug  # 遍历  # 的是  # 组中  # 迭代  # 才是  # 对其  # 要对  # 而非  # 会将  # 可能发生 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  公司门户网站制作流程,华为官网怎么做?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  IOS倒计时设置UIButton标题title的抖动问题  zabbix利用python脚本发送报警邮件的方法  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何在服务器上配置二级域名建站?  免费视频制作网站,更新又快又好的免费电影网站?  javascript中对象的定义、使用以及对象和原型链操作小结  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Android使用GridView实现日历的简单功能  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  制作企业网站建设方案,怎样建设一个公司网站?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  清除minerd进程的简单方法  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何用wdcp快速搭建高效网站?  php485函数参数是什么意思_php485各参数详细说明【介绍】  如何在云主机上快速搭建多站点网站?  香港服务器租用每月最低只需15元?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Bootstrap整体框架之JavaScript插件架构  如何在Windows环境下新建FTP站点并设置权限?  Laravel如何实现一对一模型关联?(Eloquent示例)  如何快速搭建高效可靠的建站解决方案?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Android中AutoCompleteTextView自动提示  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  JS去除重复并统计数量的实现方法  轻松掌握MySQL函数中的last_insert_id()  JavaScript中的标签模板是什么_它如何扩展字符串功能  如何自定义建站之星网站的导航菜单样式?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何获取PHP WAP自助建站系统源码?  微信小程序 canvas开发实例及注意事项  如何打造高效商业网站?建站目的决定转化率