登录
首页 >  Golang >  Go教程

Golang数组与切片区别详解

时间:2025-10-21 12:02:30 286浏览 收藏

今天golang学习网给大家带来了《Golang数组与切片值类型区别解析》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

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

golang数组与切片在值类型和指针上的不同

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],原数组未变
}

即使你修改了函数内的数组,原始数组不受影响,因为传的是副本。

切片是引用类型,共享底层数组

切片不是值类型,它是一个指向底层数组的引用(类似指针封装)。切片本身包含三个部分:指向数组的指针、长度和容量。当切片被赋值或传参时,虽然切片结构按值传递,但其内部指针仍指向同一底层数组。

这意味着对切片元素的修改会影响原始数据。

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],原数组被修改
}

这种方式避免了复制大数组的开销,也实现了共享修改。

基本上就这些。数组复制成本高但隔离性好,切片轻量且共享数据,适合动态场景。根据是否需要共享和性能要求选择合适类型。

好了,本文到此结束,带大家了解了《Golang数组与切片区别详解》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>