📅  最后修改于: 2023-12-03 15:31:01.828000             🧑  作者: Mango
在 Golang 中,切片(slice)是一种动态数组,可以根据需要动态增长或缩小。切片是对一个底层数组的引用,因此无需指定容量即可创建切片。
Golang 的切片有以下特点:
定义切片的方式和定义数组的方式类似,只需要将数组的长度去掉即可。定义一个长度为 5 的 int 类型切片的代码如下:
var s []int
对于已知的元素,可以使用切片字面量语法进行初始化:
s := []int{1, 2, 3, 4, 5}
也可以使用 make() 函数初始化切片,需要传递切片的类型和长度作为参数:
s := make([]int, 5)
make() 函数除了可以指定切片的长度,还可以指定切片的容量:
s := make([]int, 5, 10)
获取切片的长度和容量可以分别使用 len() 和 cap() 函数:
s := []int{1, 2, 3, 4, 5}
fmt.Println(len(s)) // 输出 5
fmt.Println(cap(s)) // 输出 5
可以使用 append() 函数向切片中追加元素:
s := []int{1, 2, 3, 4, 5}
s = append(s, 6, 7, 8)
fmt.Println(s) // 输出 [1 2 3 4 5 6 7 8]
append() 函数还可以将一个切片追加到另一个切片中:
s1 := []int{1, 2, 3}
s2 := []int{4, 5, 6}
s1 = append(s1, s2...)
fmt.Println(s1) // 输出 [1 2 3 4 5 6]
可以使用 copy() 函数将一个切片复制到另一个切片中:
s1 := []int{1, 2, 3}
s2 := make([]int, len(s1))
copy(s2, s1)
fmt.Println(s2) // 输出 [1 2 3]
切片可以使用索引访问和修改元素,其语法和数组类似:
s := []int{1, 2, 3, 4, 5}
fmt.Println(s[2]) // 输出 3
s[2] = 6
fmt.Println(s) // 输出 [1 2 6 4 5]
切片支持切片操作,用于获取子切片。切片操作的语法是:
s[i:j]
其中,i 和 j 分别是起始索引和终止索引,生成的子切片包含原始切片中从索引 i 到 j-1 的元素。
s := []int{1, 2, 3, 4, 5}
fmt.Println(s[1:3]) // 输出 [2 3]
如果省略 i 或 j 中任意一个,则默认使用 0 或 len(s) 作为起始索引或终止索引:
s := []int{1, 2, 3, 4, 5}
fmt.Println(s[:3]) // 输出 [1 2 3]
fmt.Println(s[2:]) // 输出 [3 4 5]
切片操作不会影响原始切片,只会生成新的切片:
s := []int{1, 2, 3, 4, 5}
s2 := s[1:3]
fmt.Println(s2) // 输出 [2 3]
s2[1] = 6
fmt.Println(s2) // 输出 [2 6]
fmt.Println(s) // 输出 [1 2 6 4 5]
使用切片可以更方便地处理动态数组,切片提供了添加、删除、修改和查询元素的方法,同时也支持切片操作,能够快速生成子切片。切片也有一定的性能成本,应该注意使用时的品味和注意事项,才能发挥其最大的优点。