切片不拥有自己的任何数据。它只是底层数组的一种表示。对切片所做的任何修改都将影响底层数组。
package main
import (
"fmt"
)
func main() {
darr := [...]int{57, 89, 90, 82, 100, 78, 67, 69, 59}
dslice := darr[2:5]
fmt.Println("array before",darr)
for i := range dslice {
dslice[i]++
}
fmt.Println("array after",darr)
}
代码行dslice := darr[2:5]
,从数组的索引2、3、4
创建dslice
。for循环将这些索引中的值加1。在for循环之后打印数组,可以看到切片的修改反映在数组中了。程序的输出是
array before [57 89 90 82 100 78 67 69 59]
array after [57 89 91 83 101 78 67 69 59]
当许多切片共享相同的底层数组时,每个切片所做的更改,都将反映在数组中。
package main
import (
"fmt"
)
func main() {
numa := [3]int{78, 79 ,80}
nums1 := numa[:] //创建一个包含数组所有元素的slice
nums2 := numa[:]
fmt.Println("array before change 1",numa)
nums1[0] = 100
fmt.Println("array after modification to slice nums1", numa)
nums2[1] = 101
fmt.Println("array after modification to slice nums2", numa)
}
numa[:]
中,起始值和结束值都省略了,它们的默认值分别是0
和len(numa)
。切片nums1
和nums2
共享同一个数组。程序的输出是
array before change 1 [78 79 80]
array after modification to slice nums1 [100 79 80]
array after modification to slice nums2 [100 101 80]
从输出中可以清楚地看到,当切片共享相同的数组时,每个切片所做的修改将反映在数组中。