在 Go 语言中,切片(slice)是一个非常重要且常用的数据结构。切片是动态数组,可以自动增长和收缩,提供了比数组更为灵活的功能。切片的底层依赖数组,但比数组更加灵活和强大。下面详细介绍切片的使用和理解,包括创建、操作和常用方法。
可以从现有数组创建切片:
package main import "fmt" func main() { arr := [5]int{1, 2, 3, 4, 5} slice := arr[1:4] // 从索引1到索引4(不包括4) fmt.Println("slice:", slice) // 输出: slice: [2 3 4] }
make
使用 make 函数创建指定长度和容量的切片:
package main import "fmt" func main() { slice := make([]int, 3, 5) // 创建一个长度为3,容量为5的切片 fmt.Println("slice:", slice) // 输出: slice: [0 0 0] fmt.Println("len:", len(slice)) // 输出: len: 3 fmt.Println("cap:", cap(slice)) // 输出: cap: 5 }
可以直接使用字面值创建并初始化切片:
package main import "fmt" func main() { slice := []int{1, 2, 3, 4, 5} fmt.Println("slice:", slice) // 输出: slice: [1 2 3 4 5] }
使用内置函数 len 和 cap 获取切片的长度和容量:
len
cap
package main import "fmt" func main() { slice := []int{1, 2, 3, 4, 5} fmt.Println("len:", len(slice)) // 输出: len: 5 fmt.Println("cap:", cap(slice)) // 输出: cap: 5 }
使用内置函数 append 向切片追加元素:
append
package main import "fmt" func main() { slice := []int{1, 2, 3} slice = append(slice, 4, 5) fmt.Println("slice:", slice) // 输出: slice: [1 2 3 4 5] }
使用内置函数 copy 将一个切片的内容复制到另一个切片:
copy
package main import "fmt" func main() { src := []int{1, 2, 3} dest := make([]int, len(src)) copy(dest, src) fmt.Println("dest:", dest) // 输出: dest: [1 2 3] }
切片可以从另一个切片中截取得到:
package main import "fmt" func main() { slice := []int{1, 2, 3, 4, 5} subSlice := slice[1:4] // 截取从索引1到索引4(不包括4)的部分 fmt.Println("subSlice:", subSlice) // 输出: subSlice: [2 3 4] }
使用 for 循环遍历切片:
for
package main import "fmt" func main() { slice := []int{1, 2, 3, 4, 5} for index, value := range slice { fmt.Printf("index: %d, value: %d\n", index, value) } }
切片的容量不足时,append 函数会自动扩容。扩容时,Go 会分配一个新的底层数组,并将旧数组的内容复制到新数组中。扩容的大小通常是按倍数增长,以减少频繁扩容的开销。
package main import "fmt" func main() { var slice []int for i := 0; i < 10; i++ { slice = append(slice, i) fmt.Printf("len: %d, cap: %d, slice: %v\n", len(slice), cap(slice), slice) } }
切片的零值是 nil,一个 nil 切片的长度和容量都是 0。切片不能直接比较,可以通过遍历比较每个元素。
nil
package main import "fmt" func main() { var slice []int if slice == nil { fmt.Println("slice is nil") // 输出: slice is nil } }
切片是 Go 语言中功能强大的数据结构,具有动态大小,方便地进行各种操作。理解切片的创建、操作和内存分配机制,有助于编写高效的 Go 代码。通过学习和掌握切片的用法,可以灵活地处理各种数据操作需求。
原文链接:codingdict.net