新闻中心

Golang中传值与传指针调用有什么区别_Golang函数参数传递机制解析

2025-11-18
浏览次数:
返回列表
Go语言中所有参数传递均为传值。传值时复制变量副本,函数内修改不影响原值,适用于基本类型和小结构体;传指针时复制地址副本,通过解引用可修改原数据,常用于大结构体或需修改原值场景。例如,modifyValue(x int) 修改形参不影响实参,而 modifyPointer(x *int) 通过指针修改使原值改变。结构体传递中,updateByName(u User) 无法更改原始对象,updateByPointer(u *User) 则可以。关键在于理解传递的是值本身还是指向值的地址:传值安全但可能低效,传指针高效但需防范并发与意外修改。

golang中传值与传指针调用有什么区别_golang函数参数传递机制解析

在Go语言中,函数参数传递始终是传值,也就是说,调用函数时会复制实参的值传递给形参。但根据传入的是普通变量还是指针对应的数据,行为表现不同,这常让人误解为“传值”和“传引用”。实际上Go中没有传引用机制,只有传值。区别在于你传的是值本身,还是指向值的指针。

传值:复制整个变量

当你将一个变量以值的方式传入函数,函数接收到的是该变量的一个副本。在函数内部对参数的修改不会影响原始变量。

适用类型:基本类型(int、string、bool等)和小结构体。

例如:

func modifyValue(x int) {
    x = 100
}
func main() {
    a := 10
    modifyValue(a)
    fmt.Println(a) // 输出:10,原值未变
}

这里 xa 的副本,修改 x 不会影响 a

传指针:复制指针地址

当你传入的是指针,虽然仍然是“传值”——复制的是指针的地址值,但由于这个副本指向同一块内存,函数可以通过指针修改原始数据。

适用场景:需要修改原数据、大结构体(避免复制开销)、共享数据。

示例:

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical
func modifyPointer(x *int) {
    *x = 100
}
func main() {
    a := 10
    modifyPointer(&a)
    fmt.Println(a) // 输出:100,原值被修改
}

这里传递的是 &a,即 a 的地址。函数内通过 *x 解引用修改了原始值。

结构体的传值与传指针对比

结构体较大时,传值会带来显著的内存复制开销,而传指针只复制地址(通常8字节),效率更高。

type User struct {
    Name string
    Age  int
}

func updateByName(u User) {
    u.Name = "Updated"
}

func updateByPointer(u *User) {
    u.Name = "Updated"
}

调用 updateByName 不会改变原结构体;而 updateByPointer 可以直接修改原对象。

总结关键点

  • Go所有参数传递都是传值,不存在传引用。
  • 传值适合小对象,安全但可能有性能损耗。
  • 传指针可修改原数据,适用于大结构体或需状态变更的场景。
  • 指针传参虽高效,但需注意并发访问和意外修改问题。

基本上就这些。理解传的是“值”还是“指向值的地址”,就能清楚函数间数据交互的行为差异。不复杂但容易忽略细节。

以上就是Golang中传值与传指针调用有什么区别_Golang函数参数传递机制解析的详细内容,更多请关注其它相关文章!


# 有什么区别  # 池州公司网站建设招聘  # 豆浆粉营销推广  # 青田网站建设方案  # 台江区平台推广营销  # seo的概念是什么  # 桂林网站设计网络推广  # 微信网站建设专业的公司  # 常宁短视频推广招聘网站  # seo网络推广排名好  # 营销推广费用控制标准  # 有什么  # 都是  # 复用  # 如何实现  # golang  # 如何使用  # 中传  # 适用于  # 原值  # 的是  # 并发访问  # 区别  # golang函数  # ai  # 字节  # go语言  # go  # 传值传指针 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 2026春节假期时间安排 2026春节假日查询  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  使用Python高效删除Word宏并转换DOCM为DOCX格式  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  Django通过AJAX异步上传图片并保存至模型的完整指南  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  优化大型XML文件解析:基于Python流式处理的内存高效方案  Python异步编程实践:使用Binance API构建实时交易数据流  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  Lar*el 8 多关键词数据库搜索优化实践  Archive of Our Own官网直达 AO3最新可用地址一览  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  必由学网页版入口 必由学官方平台直接访问  Angular Material 垂直步进器:实现底部到顶部排序的教程  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  使用Pandas转换并合并DataFrame:多列映射至统一结构  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  Golang如何优雅处理error_Golang error处理最佳实践总结  将HTML Canvas内容转换为可上传的图像文件(File对象)  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  必由学官方登录入口 必由学教师学生账号快速访问  AO3中文官网链接_AO3网页版稳定镜像站  单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分  Python多线程中正确使用sigwait处理SIGALRM信号  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  css绝对定位元素脱离父容器怎么办_确保父元素position非static  FullCalendar 自定义按钮样式定制指南  jQuery Mask 插件中实现电话号码固定前导零的教程  支付宝如何设置安全保护_支付宝安全设置的全面教程  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  iwriter统一登录平台 iwrite账号密码登录页面  快手官方唯一登录入口 谨防山寨钓鱼网站  抖音怎么赚钱_抖音创作者变现方法与途径指南  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  微信商城在哪里打开【步骤】  Fabric模组开发:自定义物品与物品组的现代管理方法  AngularJS $http POST请求数据传递与Go后端接收实践  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  铁路12306的积分有效期是多久_铁路12306积分有效期说明  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  python3时间如何用calendar输出? 

搜索