全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Golang slice与array的指针行为有什么差异_Golang底层内存结构对比

答案:Go中array是值类型,取地址得到指向其连续内存的指针,修改影响原数组且长度固定;slice是引用类型,取地址得到指向其头部结构体(含ptr/len/cap)的指针,该ptr才指向底层数组,多个slice可共享同一底层数组,修改元素相互可见,但append扩容后会断开共享;传参时[]T传递的是slice header副本,能修改底层数组内容但无法改变原slice变量指向,而[N]T传递整个数组副本,需传*[N]T才能修改原数组;关键在于指针所指目标不同:array指针直接指向数据块,slice变量本身是header值,其内部ptr才指向数据。

Go 中 slice 和 array 的指针行为差异,本质源于它们的底层内存结构不同:array 是值类型,直接持有固定长度的一段连续内存;slice 是引用类型,本身是轻量结构体(含指针、长度、容量),指向底层数组。这种设计导致“传指针”或“取地址”时的行为截然不同。

array 取地址得到的是整个数组的指针

对 array 变量使用 &a,得到的是指向该数组首元素的指针,类型为 *[N]T。这个指针直接关联整块内存,修改它所指向的内容会影响原数组,且无法通过该指针改变数组长度(长度是类型的一部分)。

例如:

var a = [3]int{1, 2, 3}
pa := &a // pa 类型是 *[3]int
pa[0] = 99 // a 变成 [99 2 3]

slice 取地址得到的是 slice 头部结构体的指针

对 slice 变量使用 &s,得到的是指向 slice 头部(header)的指针,类型为 *[]T,它指向的是包含 ptr/len/cap 三个字段的结构体本身,不是底层数组。

这意味着:

  • 修改 (*s)[i] 会作用到底层数组,影响所有共享该底层数组的 slice
  • 但修改 *s(比如赋新 slice)只改变这个头部结构体的值,不影响其他变量
  • 若想让函数内重新 make 或切片操作反映到调用方,必须传 *[]T

底层数组才是真正的数据载体,slice 共享它

多个 slice 可以基于同一底层数组(如通过 s1 := s[1:3]),它们的 header 中 ptr 字段指向同一地址。此时:

  • 任意 slice 修改元素,其他 slice 都能看到(只要索引在各自 len/cap 范围内)
  • 但 append 若触发扩容,会分配新底层数组,原 slice 的 ptr 就不再共享
  • array 没有“共享底层数组”的概念,复制就是完整拷贝

传参时的典型表现对比

函数参数是 []T 时,传的是 header 的副本(指针+长度+容量),所以能修改底层数组内容,但不能让调用方的 slice 变量指向新底层数组;而参数是 [N]T 时,传的是整个数组的副本,函数内修改不影响原数组 —— 除非你显式传 *[N]T

常见误区:以为 func f(s []int) { s = append(s, 1) } 能改变外部 slice,其实不能,因为 s 是 header 副本,append 后 s 指向新 header,原变量不变。

基本上就这些。理解关键不在“有没有指针”,而在“指针指哪儿”:array 的指针指数据块开头,slice 的指针(在 header 里)才指数据块开头,而 slice 变量自己只是 header 的值。


# go  # golang  # app  # Array  # 结构体  # int  # 指针  # 值类型  # 引用类型  # var  # 切片  # len  # cap  # append  # 的是  # 多个  # 都能  # 是指  # 而在  # 能让  # 后会  # 但不  # 才是真正  # 截然不同 


相关文章: 官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站主机是什么?如何选择适合的建站主机?  建站之星导航配置指南:自助建站与SEO优化全解析  已有域名和空间,如何快速搭建网站?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  北京网站制作公司哪家好一点,北京租房网站有哪些?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  建站主机默认首页配置指南:核心功能与访问路径优化  建站主机选购指南与交易推荐:核心配置解析  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何选择高效稳定的ISP建站解决方案?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何通过云梦建站系统实现SEO快速优化?  C#如何在一个XML文件中查找并替换文本内容  如何挑选高效建站主机与优质域名?  在线教育网站制作平台,山西立德教育官网?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何在宝塔面板中修改默认建站目录?  如何快速搭建二级域名独立网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何快速查询网站的真实建站时间?  如何在阿里云购买域名并搭建网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  制作国外网站的软件,国外有哪些比较优质的网站推荐?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  Android自定义控件实现温度旋转按钮效果  建站之星代理如何获取技术支持?  海南网站制作公司有哪些,海口网是哪家的?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  动图在线制作网站有哪些,滑动动图图集怎么做?  南平网站制作公司,2025年南平市事业单位报名时间?  如何通过万网虚拟主机快速搭建网站?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  linux top下的 minerd 木马清除方法  电商平台网站制作流程,电商网站如何制作?  如何快速搭建高效简练网站?  如何在自有机房高效搭建专业网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  济南专业网站制作公司,济南信息工程学校怎么样?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  山东云建站价格为何差异显著?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何快速搭建高效香港服务器网站?  如何配置支付宝与微信支付功能?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  建站之星安装后界面空白如何解决?  如何在Golang中使用replace替换模块_指定本地或远程路径 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。