传值可修改底层数组元素但无法改变原切片结构,传指针能真正修改原切片本身。1. 值传递复制slice header,共享底层数组;2. 指针传递可修改原切片的指向、长度和容量;3. 需要扩容或重新赋值时应使用指针。

在 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写作辅助平台
302 查看详情
立即学习“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
微信扫一扫
支付宝扫一扫