📌  相关文章
📜  golang 中的切片 - Go 编程语言 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:31:01.828000             🧑  作者: Mango

golang 中的切片 - Go 编程语言 - Go 编程语言

介绍

在 Golang 中,切片(slice)是一种动态数组,可以根据需要动态增长或缩小。切片是对一个底层数组的引用,因此无需指定容量即可创建切片。

Golang 的切片有以下特点:

  • 切片长度可变,可以动态增长或缩小
  • 切片可以使用 len() 和 cap() 函数获取长度和容量
  • 切片可以用 append() 函数向切片中追加元素
  • 切片可以用 copy() 函数复制切片
  • 切片可以通过索引访问和修改元素
  • 切片支持切片操作,可以通过切片操作获取子切片
定义和初始化切片

定义切片的方式和定义数组的方式类似,只需要将数组的长度去掉即可。定义一个长度为 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]
总结

使用切片可以更方便地处理动态数组,切片提供了添加、删除、修改和查询元素的方法,同时也支持切片操作,能够快速生成子切片。切片也有一定的性能成本,应该注意使用时的品味和注意事项,才能发挥其最大的优点。