在 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
获取切片的长度和容量:
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
向切片追加元素:
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
将一个切片的内容复制到另一个切片:
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
循环遍历切片:
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。切片不能直接比较,可以通过遍历比较每个元素。
package main
import "fmt"
func main() {
var slice []int
if slice == nil {
fmt.Println("slice is nil") // 输出: slice is nil
}
}
切片是 Go 语言中功能强大的数据结构,具有动态大小,方便地进行各种操作。理解切片的创建、操作和内存分配机制,有助于编写高效的 Go 代码。通过学习和掌握切片的用法,可以灵活地处理各种数据操作需求。
原文链接:codingdict.net