首页 > 后端开发 > Golang > 正文

golang切片传递指针和传递值的效果不同

P粉602998670
发布: 2025-10-05 16:35:02
原创
757人浏览过
传值可修改底层数组元素但无法改变原切片结构,传指针能真正修改原切片本身。1. 值传递复制slice header,共享底层数组;2. 指针传递可修改原切片的指向、长度和容量;3. 需要扩容或重新赋值时应使用指针。

golang切片传递指针和传递值的效果不同

在 Go 语言中,切片(slice)本身是引用类型,但它有自己的底层数组和长度、容量信息。虽然切片包含引用语义,但在函数参数传递时,传值和传指针会产生不同的效果,尤其是在修改切片结构本身(比如重新分配、扩容、指向新底层数组)时。

1. 传递切片的值(按值传递)

当你将切片以值的方式传入函数,实际上是复制了这个切片的头部结构(即指向底层数组的指针、长度 len、容量 cap),但底层数组仍是共享的。

这意味着:

  • 可以修改底层数组的元素(因为指针相同)
  • 但无法让原切片指向新的底层数组(因为只改了副本)
示例:

func modifySlice(s []int) {
    s[0] = 999        // 修改底层数组,影响原切片
    s = append(s, 4)  // 只修改副本,不影响原切片
}

func main() {
    a := []int{1, 2, 3}
    modifySlice(a)
    fmt.Println(a) // 输出: [999 2 3],append 没生效
}
登录后复制

2. 传递切片的指针(按指针传递)

当传递切片的指针时,函数内可以通过指针修改原始切片结构本身,包括让它指向新的底层数组或改变其 len/cap。

协和·太初
协和·太初

国内首个针对罕见病领域的AI大模型

协和·太初 38
查看详情 协和·太初

立即学习go语言免费学习笔记(深入)”;

示例:

func modifySlicePtr(s *[]int) {
    (*s)[0] = 888           // 修改元素
    *s = append(*s, 5, 6)   // 修改原切片本身,指向可能变化
}

func main() {
    b := []int{1, 2, 3}
    modifySlicePtr(&b)
    fmt.Println(b) // 输出: [888 2 3 5 6],append 生效
}
登录后复制

3. 什么时候该用指针?

以下情况建议传指针:

  • 需要通过 append 扩容并希望调用方看到新切片
  • 可能会重新赋值切片,如 s = otherSlice
  • 切片很大,避免复制 slice header(虽然 header 很小,一般不是性能瓶颈

如果只是读取或修改元素内容,传值更简洁安全。

基本上就这些。切片虽然是“引用类型”,但它的值传递仍是值拷贝,只有指针才能真正修改原变量。

以上就是golang切片传递指针和传递值的效果不同的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号