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

在 Go 语言中,切片(slice)本身是引用类型,但它有自己的底层数组和长度、容量信息。虽然切片包含引用语义,但在函数参数传递时,传值和传指针会产生不同的效果,尤其是在修改切片结构本身(比如重新分配、扩容、指向新底层数组)时。
当你将切片以值的方式传入函数,实际上是复制了这个切片的头部结构(即指向底层数组的指针、长度 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 没生效
}当传递切片的指针时,函数内可以通过指针修改原始切片结构本身,包括让它指向新的底层数组或改变其 len/cap。
立即学习“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 生效
}以下情况建议传指针:
append 扩容并希望调用方看到新切片s = otherSlice
如果只是读取或修改元素内容,传值更简洁安全。
基本上就这些。切片虽然是“引用类型”,但它的值传递仍是值拷贝,只有指针才能真正修改原变量。以上就是golang切片传递指针和传递值的效果不同的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号