新闻中心
如何在Golang中理解指针和引用区别_Golang 指针引用区别实践
Go只有值传递,所谓“引用”是因复合类型内部含指针;传参时复制值,但指针指向同一地址,故能修改原数据。

在 Golang 中理解指针和“引用”的区别,关键在于搞清楚 Go 语言中到底有没有真正的“引用类型”,以及指针是如何工作的。很多人会把 slice、map 或 channel 的行为误认为是“引用传递”,但实际上 Go 只有值传递,而指针是一种显式的内存地址操作工具。
Go 中只有值传递
Go 函数传参时,所有参数都是值传递,也就是说会复制变量的副本。对于基本类型(如 int、string、bool),这很直观:函数内修改不会影响原值。但对于复合类型如 slice、map,看起来却像“引用”一样能被修改,容易引起误解。
例如:func modifySlice(s []int) {
s[0] = 999
}
s := []int{1, 2, 3}
modifySlice(s)
fmt.Println(s) // 输出 [999 2 3]
虽然函数没有返回值,但原始 slice 被改变了。这不是因为 slice 是“引用类型”,而是因为它内部包含一个指向底层数组的指针。你传的是 slice 的副本,但副本仍指向同一个底层数组。
指针:显式操作内存地址
指针才是 Go 中真正用来间接访问变量的方式。通过 & 取地址,用 * 解引用。
示例:func increment(x *int) {
*x++
}
n := 10
increment(&n)
fmt.Println(n) // 输出 11
这里明确传递了变量 n 的地址,函数通过指针对其直接修改。这是典型的指针操作,也是唯一能真正改变外部变量的方法(除了 channel 等内置类型的特殊语义)。
常见类型的“引用-like”行为解析
以下类型在函数中修改会影响原数据,但机制各不相同:
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
-
slice:包含指向底层数组的
指针,复制 slice 时复制的是结构体(指针 + len + cap),所以多个 slice 可共享底层数组 - map:本质是一个指向 runtime.hmap 的指针,复制 map 变量只是复制指针,所有副本操作同一底层结构
- channel:类似 map,复制的是指针,多个变量引用同一个通信通道
- 指针类型:直接传递内存地址,解引用可修改原值
这些都不是“引用传递”,而是“值传递了一个指针”。Go 没有像 C++ 那样的引用语法(如 int&)。
什么时候该用指针?
使用指针主要出于两个目的:修改原数据 和 提升性能(避免大对象拷贝)。
- 需要修改调用方变量时,参数应为 *T 类型
- 结构体较大时,传 *Struct 比传 Struct 更高效
- 方法接收者若需修改字段,应使用指针接收者
type Person struct {
Name string
}
func (p *Person) Rename(newName string) {
p.Name = newName
}
这样调用 p.Rename("Bob") 才能真正改变 p 的 Name 字段。
基本上就这些。记住:Go 只传值,指针是值的一种;所谓“引用”只是某些类型内部含指针导致的错觉。理解这点,就不会混淆了。
以上就是如何在Golang中理解指针和引用区别_Golang 指针引用区别实践的详细内容,更多请关注其它相关文章!
# 是一个
# 深圳安天网站优化怎么样
# 绩效平台网站优化方案
# 智能设计关键词排名软件
# 为什么需要网络营销推广
# 西平附近推广营销中心
# 营销与推广分析论文
# 网站推广服务哪个最好
# 唐山运营网站推广优势
# 平潭技术推广营销排名
# 安顺网站建设订制报价
# 原值
# 这是
# golang
# 都是
# 复用
# 如何实现
# 如何使用
# 多个
# 如何在
# 的是
# 区别
# c++
# 工具
# go
# 指针
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
精准捕获:如何在页面中监听除特定元素外的所有点击事件
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
J*a递归快速排序中静态变量导致数据累积问题的解决方案
Bing引擎入口最新2025 Bing搜索免费官方登录
C++如何解决segmentation fault_C++段错误调试与原因分析
如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
优化大型XML文件解析:基于Python流式处理的内存高效方案
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注
J*aScript DOM操作:高效清空列表元素的策略与实践
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
机器学习中对数变换预测结果的反向还原
夸克AO3官网入口_AO3镜像网站2025推荐
不同用户不同价格! 索尼开启账户个性化定价测试
PHP 枚举:根据字符串获取枚举案例的策略与实现
马斯克:Optimus 人形机器人复数形式为 Optimi
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
ArrayList与LinkedList操作复杂度详解:遍历与修改
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】
小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍
Golang如何使用new_Go new分配内存机制讲解
顺丰快递查单号物流信息 顺丰快递小程序查询入口
微信群消息显示延迟如何解决 微信群消息刷新优化方法
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
随机参数递归函数的基准调用次数与时间复杂度探究
PHP中获取MongoDB服务器运行时间(Uptime)的专业指南
学习通网页版快速入口 学习通官网网页版直接打开
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
12306选座怎么选到临时改签座_12306改签选座策略与步骤
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
React列表渲染与独立状态管理:避免全局状态影响局部更新
J*aScript数据结构转换:将对象数组按类别分组
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
React Hooks最佳实践:动态组件状态管理的组件化方案
Go语言中的*string:深入理解字符串指针
excel怎么制作工资条 excel快速生成工资条的方法
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
Win11怎么开启高性能模式_Windows 11电源计划优化设置
大象笔记网页版入口 印象笔记网页版登录入口
Golang如何使用context实现超时取消_Golang context超时取消模式实践
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
菜鸟取件码是什么怎么查 最全查询渠道汇总
Django通过AJAX异步上传图片并保存至模型的完整指南
J*aScript map 迭代中检测空数组元素的有效方法
优化Django表单:提交验证失败后保留用户输入


2025-11-21
浏览次数:次
返回列表
指针,复制 slice 时复制的是结构体(指针 + len + cap),所以多个 slice 可共享底层数组