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

传值可修改底层数组元素但无法改变原切片结构,传指针能真正修改原切片本身。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 青泥AI

青泥学术AI写作辅助平台

青泥AI 302 查看详情 青泥AI

立即学习“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切片传递指针和传递值的效果不同的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1145907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Umasou!恐龙妹来啦!《魔域》潮玩节今日开幕,盲盒玩法惊喜满满!
上一篇 2025年12月2日 19:23:41
在windows10上安装mysql详细图文教程_MySQL
下一篇 2025年12月2日 19:23:46

相关推荐

发表回复

登录后才能评论
关注微信