Go基础Slice教程详解

2019-11-10 11:34:28于海丽

package main
import (
 "fmt"
)
func main() {
 arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
 slice := arr[2:5]
 fmt.Println("array before", arr)
 for i := range slice {
  slice[i]++
 }
 fmt.Println("array after ", arr)
}

在上述程序的第 9 行,我们根据数组索引 2,3,4 创建一个切片 dslice 。for 循环将这些索引中的值逐个递增。当我们使用 for 循环打印数组时,我们可以看到对切片的更改反映在数组中。该程序的输出是

array before [0 1 2 3 4 5 6 7 8 9]
array after [0 1 3 4 5 5 6 7 8 9]

当多个切片共用相同的底层数组时,每个切片所做的更改将反映在数组中。

package main
import (
 "fmt"
)
func main() {
 array := [4]int{10, 20 ,30, 40}
 slice1 := array[:]
 slice2 := array[:]
 fmt.Println("array before change:", array)
 slice1[0] = 60
 fmt.Println("array after modification to slice slice1:", array)
 slice2[1] = 70
 fmt.Println("array after modification to slice slice2:", array)
}

在 9 行中, numa [:] 缺少开始和结束值。开始和结束的默认值分别为 0 和 len (numa) 。两个切片 nums1 和 nums2 共享相同的数组。该程序的输出是

array before change: [10 20 30 40]
array after modification to slice slice1: [60 20 30 40]
array after modification to slice slice2: [60 70 30 40]

从输出中可以清楚地看出,当切片共享同一个数组时,每个所做的修改都会反映在数组中。

切片的长度和容量

切片的长度是切片中的元素数。 切片的容量是从创建切片索引开始的底层数组中元素数。

package main
import (
 "fmt"
)
func main() {
 fruitarray := [...]string{"apple", "orange", "grape", "mango", "water melon", "pine apple", "chikoo"}
 fruitslice := fruitarray[1:3]
 fmt.Printf("length of slice %d capacity %d", len(fruitslice), cap(fruitslice)) // length of is 2 and capacity is 6
}

在上面的程序中, fruitslice 是从 fruitarray 的索引 1 和 2 创建的。 因此, fruitlice 的长度为 2 。

fruitarray 的长度是 7。 fruiteslice 是从 fruitarray 的索引 1 创建的。因此, fruitslice 的容量是从 fruitarray 索引为 1 开始,也就是说从 orange 开始,该值是 6 。因此, fruitslice 的容量为 6。该程序]输出切片的 **长度为 2 容量为 6 **。

切片可以重置其容量。任何超出这一点将导致程序运行时抛出错误。

package main
import (
 "fmt"
)
func main() {
 fruitarray := [...]string{"apple", "orange", "grape", "mango", "water melon", "pine apple", "chikoo"}
 fruitslice := fruitarray[1:3]
 fmt.Printf("length of slice %d capacity %dn", len(fruitslice), cap(fruitslice)) // length of is 2 and capacity is 6
 fruitslice = fruitslice[:cap(fruitslice)] // re-slicing furitslice till its capacity
 fmt.Println("After re-slicing length is",len(fruitslice), "and capacity is",cap(fruitslice))
}