📜  Golang 中的切片(1)

📅  最后修改于: 2023-12-03 14:41:34.500000             🧑  作者: Mango

Golang 中的切片

在 Golang 中,切片(slice)是一个非常重要的数据结构,它可以看作是对数组的一种抽象,使用起来更加灵活和方便。

切片的定义

在 Golang 中,可以使用如下方式定义一个切片:

var s []int         // 定义一个 nil 切片,长度和容量都为 0
s := make([]int, 5) // 定义一个长度为 5,容量为 5 的切片
s := make([]int, 5, 10) // 定义一个长度为 5,容量为 10 的切片
切片的基本操作
添加元素

使用 append 函数可以向切片中添加元素:

s := []int{1,2,3}
s = append(s, 4, 5, 6)

使用这种方式添加元素时,如果原切片容量不足,会自动扩容,扩容的规则为原容量的两倍。

访问元素

切片的元素访问和数组类似,可以使用下标的方式访问:

s := []int{1,2,3}
s[0] = 0
fmt.Println(s[0]) // 0
切片操作

可以使用切片对原切片进行切分,切片操作的语法为:slice[low:high],表示截取从下标 low 开始,到下标 high 终止(但不包括 high)的子切片。

举个例子:

s := []int{1,2,3,4,5}
s1 := s[1:3] // s1 = []int{2,3}
s2 := s[:3] // s2 = []int{1,2,3}
s3 := s[3:] // s3 = []int{4,5}

需要注意的是,切片只是对原底层数组的一个引用,并没有自己的内存空间,因此修改切片的元素会影响底层数组和其他引用该数组的切片。

删除元素

由于切片的容量不是固定的,如果需要删除元素,则可以将删除元素的位置之后的元素全部向前移动一位:

s := []int{1, 2, 3, 4, 5}
i := 2 // 将第 3 个元素删除
copy(s[i:], s[i+1:])
s = s[:len(s)-1]

这里使用 copy 函数将后面的元素向前移动一位,然后再将底层数组长度减 1 即可。

切片作为函数参数

在 Golang 中,当一个切片作为函数参数时,默认情况下传递的是一个指向原切片底层数组的指针,因此在函数内对切片进行修改时会影响到原切片。

举个例子:

func modifySlice(s []int) {
    s[0] = 0
}

func main() {
    s := []int{1,2,3}
    modifySlice(s)
    fmt.Println(s) // [0 2 3]
}

由于传递的是指针,函数内对切片的修改会影响到原切片的值。

如果需要在函数内部对切片进行修改而不影响原切片,则需要创建一个新的切片,并将原切片的值复制过去:

func modifySlice(s []int) {
    s = append([]int(nil), s...)
    s[0] = 0
}

func main() {
    s := []int{1,2,3}
    modifySlice(s)
    fmt.Println(s) // [1 2 3]
}
总结

切片是 Golang 中非常常用的数据结构,通过灵活的切片操作,可以更方便地处理数组,同时在函数调用时也可以使用切片作为参数,提高代码的可读性和可维护性。