创建切片
package main
import "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 main
import "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 main
import "fmt"
func main() {
Slice := [] int {1, 2, 3, 4, 5, 6, 7}
newSlice := Slice[1:3]
newSlice[0] = 10
fmt.Println(newSlice)
fmt.Println(Slice)
}
[10 3] // 底层数组被改变了
[1 10 3 4 5 6 7]