Golang数组切片区别

新手学习Golang时对数组和切片的区别不太理解,想请教几个问题:

  1. 数组和切片在内存结构上有什么本质区别?
  2. 为什么切片比数组更常用?
  3. 切片作为函数参数传递时会发生什么?是值传递还是引用传递?
  4. 数组和切片在扩容机制上有什么不同?

最好能用实际代码例子说明下它们的区别和使用场景,感谢!

2 回复

Golang中,数组是固定长度的值类型,切片是动态长度的引用类型。数组赋值会复制整个数据,切片赋值共享底层数组。切片更灵活,常用作函数参数。

更多关于Golang数组切片区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 Go 语言中,数组和切片是两种不同的数据结构,主要区别如下:

1. 长度固定性

  • 数组:长度固定,声明时必须指定长度(例如 [3]int),无法动态改变。
  • 切片:长度可变,基于数组或直接创建,支持动态扩容(例如 []int)。

2. 声明与初始化

  • 数组
    var arr [3]int        // 声明长度为3的数组,初始值为0
    arr := [3]int{1,2,3}  // 初始化赋值
    
  • 切片
    var s []int           // 声明为nil切片
    s := []int{1,2,3}     // 初始化
    s := make([]int, 3)   // 使用make创建,长度3,容量3
    

3. 底层关系

  • 切片是对数组的抽象,包含三个字段:
    • 指针:指向底层数组的起始元素。
    • 长度(len):当前元素个数。
    • 容量(cap):从起始位置到底层数组末尾的元素数。

4. 传递方式

  • 数组是值类型,赋值或传参时会复制整个数组。
  • 切片是引用类型,传递时复制切片头(指针、长度、容量),但共享底层数组。

5. 扩容机制

  • 切片可调用 append() 动态添加元素。容量不足时,会创建新底层数组并拷贝数据(通常按2倍容量扩容)。

示例代码

// 数组
arr := [3]int{1, 2, 3}
// 切片
slice := []int{1, 2, 3}
slice = append(slice, 4) // 动态扩展

// 从数组创建切片
subSlice := arr[1:3] // 引用arr的部分数据

总结

  • 需要固定大小时用数组,需动态调整时用切片
  • 切片更灵活,是 Go 中常用的集合类型。
回到顶部