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

Go语言中,数组和切片在值类型与指针行为上的差异主要体现在赋值、传递和底层结构上。理解这些区别有助于避免常见陷阱,尤其是在函数传参和数据共享时。
Go中的数组是固定长度的序列,属于值类型。这意味着当你将一个数组赋值给另一个变量,或将其传入函数时,会复制整个数组的内容。
例如:
func modifyArray(arr [3]int) {即使你修改了函数内的数组,原始数组不受影响,因为传的是副本。
立即学习“go语言免费学习笔记(深入)”;
切片不是值类型,它是一个指向底层数组的引用(类似指针封装)。切片本身包含三个部分:指向数组的指针、长度和容量。当切片被赋值或传参时,虽然切片结构按值传递,但其内部指针仍指向同一底层数组。
这意味着对切片元素的修改会影响原始数据。
func modifySlice(s []int) {尽管函数参数是“值传递”,但由于指针共享底层数组,修改依然生效。
虽然数组默认是值传递,但你可以通过传递数组指针来实现引用语义。
func modifyArrayViaPointer(arr *[3]int) {这种方式避免了复制大数组的开销,也实现了共享修改。
基本上就这些。数组复制成本高但隔离性好,切片轻量且共享数据,适合动态场景。根据是否需要共享和性能要求选择合适类型。
以上就是golang数组与切片在值类型和指针上的不同的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号