下面的代码中,foo 与 bar 最后的值是什么?
foo := []int{0,0,0,42,100}
bar := foo[1:4]
bar[1] = 99
fmt.Println("foo:", foo)
fmt.Println("bar:", bar)
// foo: [0 0 99 42 100]
// bar: [0 99 42]
下面程序输出什么?
x := []int{1, 2, 3, 4}
y := x[:2]
fmt.Println(cap(x), cap(y))
y = append(y, 30)
fmt.Println("x:", x)
fmt.Println("y:", y)
// Output
// 4, 4
// 1,2,30,4
// 1,2,30
底层结构
和 C 语言中的数组是一个指针不同,Go 中的切片是一个复合结构。一个切片在运行时由指针(data)、长度(len)和容量(cap)三部分构成。
type SliceHeader struct {
Data uintptr // 指向切片元素对应的底层数组元素的地址。
Len int // 对应切片中元素的数目,总长度不能超过容量。
Cap int // 提供了额外的元素空间,可以在之后更快地添加元素。容量的大小一般指的是从切片的开始位置到底层数据的结尾位置的长度。
}
截取
切片在被截取时的一个特点是,截取后的切片长度和容量可能会发生变化。
和数组一样,切片中的数据仍然是内存中一片连续的区域。要获取切片某一区域的连续数据,可以通过下标的方式对切片进行截断。被截取后的切片,它的长度和容量都发生了变化。就像下面这个例子,numbers 切片的长度为 8。number1 截取了 numbers 切片中的第 2、3 号元素。number1 切片的长度变为了 2,容量变为了 6(即从第 2 号元素开始到元素数组的末尾)。
numbers:= []int{1,2,3,4,5,6,7,8}
// 从下标2 一直到下标4,但是不包括下标4
numbers1 :=numbers[2:4]
// 从下标0 一直到下标3,但是不包括下标3
numbers2 :=numbers[:3]
// 从下标3 一直到结尾
numbers3 :=numbers[3:]
</

最低0.47元/天 解锁文章

708

被折叠的 条评论
为什么被折叠?



