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
新切片的容量现在小于原始切片的容量,因为新的底层数组较小。