创建切片
package mainimport "fmt"func main () {var s = make([] int, 1) // length 必须指定, capacity 无需指定。fmt.Println(s, len(s),cap(s)) // 输出 length 与 capacity 的值s = [] int {1,2,3,4} // 多个赋值fmt.Println(s, len(s),cap(s))s = append(s, 5) // 通过 append() 为 slice 添加值fmt.Println(s,len(s),cap(s))}
[0] 1 1 // length 被指定为 1 ,capacity 初始等于 length[1 2 3 4] 4 4 // 赋值之后 length 自动变成了 4 ,capacity 也变成了 4[1 2 3 4 5] 5 8 // 增加一个元素后 length 变成 5,capacity*2 ,当 length=capacity 时 capacity*2。
切片模型
切片的长度不会超过切片的容量所以:0 <= len(s) <= cap(s)
当 length=capacity 时,capacity 以 capacity *2 的速度增长,若 slice 超过1k 字节 ,capacity 以1.5增长。
切片索引
package mainimport "fmt"func main () {var k = make([] string, 0) //空切片fmt.Println(k, len(k), cap(k))k = [] string {"g", "o", "l", "a", "n", "g"}fmt.Println(k[2:4])}
[] 0 0 // length:0 capacity:0[l a] // k[:end-1]
由于切片指向一个底层数组,切片的索引表达式为 slice[start:end]。
其中 arr[0]=slice[0]=slice[start],但在输出时为 end-1 。若写成 k[ : ] 则表示从开 start 到 end。
切片共用底层数组
package mainimport "fmt"func main() {Slice := [] int {1, 2, 3, 4, 5, 6, 7}newSlice := Slice[1:3]newSlice[0] = 10fmt.Println(newSlice)fmt.Println(Slice)}
[10 3] // 底层数组被改变了[1 10 3 4 5 6 7]
