在 Go 语言中,切片(slice)是一个比数组更强大、更灵活的数据结构。切片是对数组的一个抽象,它比数组提供了更多的功能,比如动态大小调整。以下是 Go 切片的基本概念和用法:
1. 切片的定义
切片的定义类似于数组,但不需要指定长度:
Go
var s []int // 定义一个整数切片,初始为空
2. 创建切片
几种方式创建切片:
- 基于数组创建切片:
Go
arr := [5]int{1, 2, 3, 4, 5}
s := arr[1:4] // 从数组创建一个切片,包含元素 2, 3, 4
-
使用内置函数
make
创建切片:Gos := make([]int, 5) // 创建一个长度为5的整数切片,初始值为0 s = make([]int, 5, 10) // 创建一个长度为5,容量为10的切片
-
直接用字面量创建切片:
Gos := []int{1, 2, 3, 4, 5} // 创建并初始化一个切片
3. 切片的基本操作
-
访问和修改元素:
Gos[0] = 10 // 修改切片的第一个元素 fmt.Println(s[0]) // 访问切片的第一个元素
-
切片的长度和容量:
Gofmt.Println(len(s)) // 切片的长度 fmt.Println(cap(s)) // 切片的容量
-
追加元素:
Gos = append(s, 6) // 在切片末尾追加一个元素
-
切片的切片:
GosubSlice := s[1:3] // 创建切片的一个子切片,包含元素 s[1] 和 s[2]
4. 切片的底层实现
切片的底层是一个数组。切片包含以下三个字段:
- 指向底层数组的指针。
- 切片的长度(len)。
- 切片的容量(cap),表示从切片的第一个元素到数组末尾的元素个数。
5. 切片的注意事项
- 共享底层数组: 切片和它的子切片共享同一个底层数组,因此修改一个切片的元素会影响到其他共享相同底层数组的切片。
- 追加和扩容: 当切片的容量不足以容纳新追加的元素时,Go 会自动分配一个新的底层数组,并将原有数据复制到新数组中。这是一个相对昂贵的操作。