Go 访问、修改、添加和复制切片
访问切片的元素
您可以通过引用索引号来访问特定的切片元素。
在 Go 中,索引从 0 开始。这意味着 [0] 是第一个元素,[1] 是第二个元素,依此类推。
实例
此例展示了如何访问 prices
切片中的第一个和第三个元素:
package main import ("fmt") func main() { prices := []int{10,20,30} fmt.Println(prices[0]) fmt.Println(prices[2]) }
结果:
10 30
修改切片的元素
你也可以通过引用索引号来修改特定的切片元素。
实例
此例展示了如何修改 prices
切片中的第三个元素:
package main import ("fmt") func main() { prices := []int{10,20,30} prices[2] = 50 fmt.Println(prices[0]) fmt.Println(prices[2]) }
结果:
10 50
向切片添加元素
你可以使用 append()
函数将元素添加到切片的末尾:
语法
slice_name = append(slice_name, element1, element2, ...)
实例
此例展示了如何将元素添加到切片的末尾:
package main import ("fmt") func main() { myslice1 := []int{1, 2, 3, 4, 5, 6} fmt.Printf("myslice1 = %v\n", myslice1) fmt.Printf("length = %d\n", len(myslice1)) fmt.Printf("capacity = %d\n", cap(myslice1)) myslice1 = append(myslice1, 20, 21) fmt.Printf("myslice1 = %v\n", myslice1) fmt.Printf("length = %d\n", len(myslice1)) fmt.Printf("capacity = %d\n", cap(myslice1)) }
结果:
myslice1 = [1 2 3 4 5 6] length = 6 capacity = 6 myslice1 = [1 2 3 4 5 6 20 21] length = 8 capacity = 12
将一个切片追加到另一个切片
要将一个切片的所有元素追加到另一个切片,请使用 append()
/ 函数:
语法
slice3 = append(slice1, slice2...)
注意:在将一个切片的元素追加到另一个切片时,slice2
后的 '...' 是必需的。
实例
此例展示了如何将一个切片追加到另一个切片:
package main import ("fmt") func main() { myslice1 := []int{1,2,3} myslice2 := []int{4,5,6} myslice3 := append(myslice1, myslice2...) fmt.Printf("myslice3=%v\n", myslice3) fmt.Printf("length=%d\n", len(myslice3)) fmt.Printf("capacity=%d\n", cap(myslice3)) }
结果:
myslice3=[1 2 3 4 5 6] length=6 capacity=6
更改切片的长度
与数组不同,切片的长度是可变的。
实例
此例展示了如何更改切片的长度:
package main import ("fmt") func main() { arr1 := [6]int{9, 10, 11, 12, 13, 14} // 一个数组 myslice1 := arr1[1:5] // 切片数组 fmt.Printf("myslice1 = %v\n", myslice1) fmt.Printf("length = %d\n", len(myslice1)) fmt.Printf("capacity = %d\n", cap(myslice1)) myslice1 = arr1[1:3] // 通过重新切片数组来改变长度 fmt.Printf("myslice1 = %v\n", myslice1) fmt.Printf("length = %d\n", len(myslice1)) fmt.Printf("capacity = %d\n", cap(myslice1)) myslice1 = append(myslice1, 20, 21, 22, 23) // 通过添加项目来改变长度 fmt.Printf("myslice1 = %v\n", myslice1) fmt.Printf("length = %d\n", len(myslice1)) fmt.Printf("capacity = %d\n", cap(myslice1)) }
结果:
myslice1 = [10 11 12 13] length = 4 capacity = 5 myslice1 = [10 11] length = 2 capacity = 5 myslice1 = [10 11 20 21 22 23] length = 6 capacity = 10
内存效率
当使用切片时,Go 会将所有底层元素加载到内存中。
如果数组很大,而你只需要几个元素,那么最好使用 copy()
函数来复制这些元素。
copy()
函数会创建一个新的底层数组,其中仅包含切片所需的元素。这将减少程序使用的内存。
语法
copy(dest, src)
copy()
函数采用两个切片 dest 和 src,并将数据从 src 复制到 dest。它返回复制的元素数。
实例
此例展示了如何使用 copy()
函数:
package main import ("fmt") func main() { numbers := []int{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} // 原始切片 fmt.Printf("numbers = %v\n", numbers) fmt.Printf("length = %d\n", len(numbers)) fmt.Printf("capacity = %d\n", cap(numbers)) // 仅使用所需数字创建副本 neededNumbers := numbers[:len(numbers)-10] numbersCopy := make([]int, len(neededNumbers)) copy(numbersCopy, neededNumbers) fmt.Printf("numbersCopy = %v\n", numbersCopy) fmt.Printf("length = %d\n", len(numbersCopy)) fmt.Printf("capacity = %d\n", cap(numbersCopy)) }
结果:
// 原始切片 numbers = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] length = 15 capacity = 15 // 新切片 numbersCopy = [1 2 3 4 5] length = 5 capacity = 5
新切片的容量现在小于原始切片的容量,因为新的底层数组较小。