新闻中心

如何在Golang中理解指针和引用区别_Golang 指针引用区别实践

2025-11-21
浏览次数:
返回列表
Go只有值传递,所谓“引用”是因复合类型内部含指针;传参时复制值,但指针指向同一地址,故能修改原数据。

如何在golang中理解指针和引用区别_golang 指针引用区别实践

在 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 CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA
  • 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表单:提交验证失败后保留用户输入 

搜索