登录
首页 >  Golang >  Go教程

Golang数组与切片区别详解

时间:2025-10-15 09:38:29 252浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《Golang数组与切片值类型区别解析》,文章讲解的知识点主要包括,如果你对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学习网公众号,带你了解更多关于的知识点!

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