数组是值类型,赋值和传参时复制整个数据,互不影响;切片是引用类型,共享底层数组,修改会影响原数据;可通过数组指针实现引用语义。

Go语言中,数组和切片在值类型与指针行为上的差异主要体现在赋值、传递和底层结构上。理解这些区别有助于避免常见陷阱,尤其是在函数传参和数据共享时。
数组是值类型,赋值会复制整个数据
Go中的数组是固定长度的序列,属于值类型。这意味着当你将一个数组赋值给另一个变量,或将其传入函数时,会复制整个数组的内容。
例如:
func modifyArray(arr [3]int) {arr[0] = 999
}
func main() {
a := [3]int{1, 2, 3}
modifyArray(a)
fmt.Println(a) // 输出: [1 2 3],原数组未变
}
即使你修改了函数内的数组,原始数组不受影响,因为传的是副本。
立即学习“go语言免费学习笔记(深入)”;
切片是引用类型,共享底层数组
切片不是值类型,它是一个指向底层数组的引用(类似指针封装)。切片本身包含三个部分:指向数组的指针、长度和容量。当切片被赋值或传参时,虽然切片结构按值传递,但其内部指针仍指向同一底层数组。
AlegroCart新功能:维类:包括在这两种线性长宽高或面积或体积长波产品尺寸允许与期权产品:让产品/期权组合独特的数量,尺寸,图像和型号。选择店铺标识管理 图片放大镜:显示一个图片放大上空盘旋时,产品形象弹出框。自定义错误报告:设置在管理员启用。 开发者只可以显示详细的信息。错误信息都写入到错误日志文件每天可以通过电子邮件发送给管理员。仓库皮卡航运模块:允许客户指定产品在商店的位置回升。增加了
这意味着对切片元素的修改会影响原始数据。
func modifySlice(s []int) {s[0] = 999
}
func main() {
slice := []int{1, 2, 3}
modifySlice(slice)
fmt.Println(slice) // 输出: [999 2 3],原始切片被修改
}
尽管函数参数是“值传递”,但由于指针共享底层数组,修改依然生效。
使用指针可以显式控制数组的引用行为
虽然数组默认是值传递,但你可以通过传递数组指针来实现引用语义。
func modifyArrayViaPointer(arr *[3]int) {arr[0] = 999
}
func main() {
a := [3]int{1, 2, 3}
modifyArrayViaPointer(&a)
fmt.Println(a) // 输出: [999 2 3],原数组被修改
}
这种方式避免了复制大数组的开销,也实现了共享修改。
基本上就这些。数组复制成本高但隔离性好,切片轻量且共享数据,适合动态场景。根据是否需要共享和性能要求选择合适类型。









