append()方法为切片添加元素
注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化。
var s []int s = append(s, 1, 2, 3)
切片的扩容策略
查看$GOROOT/src/runtime/slice.go源码
package main import "fmt" // append() 为切片追加元素 func main(){ s1 := []string{"北京", "上海", "深圳"} fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1)) // s1[3] = "广州" // 错误的写法 会导致编译错误:索引越界 // fmt.Println(s1) // index out of range [3] with length 3 // 调用append函数必须用原来的切片变量接收返回值 // append追加元素 原来的底层数组放不下的时候 Go语言就会把底层数组换一个 // 必须用变量接收append的返回值 fmt.Println(s1) s1 = append(s1, "广州") fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1)) s1 = append(s1, "杭州", "成都") fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1)) ss := []string{"武汉", "西安", "苏州"} s1 = append(s1, ss...) // ...表示拆开 fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1)) }
使用copy()函数复制切片
copy()函数的格式:
copy(destSlice, srcSlice []T)
其中:
从切片中删除元素
package main import "fmt" // 关于append删除切片中的某个元素 func main(){ a1 := [...]int{1,3,5,7,9,11,13,15,17} s1 := a1[:] // 删除索引为1的那个3 s1 = append(s1[0:1], s1[2:]...) fmt.Println(s1) // [1 5 7 9 11 13 15 17] fmt.Println(a1) // [1 5 7 9 11 13 15 17 17] }
切片不存值 底层数组存值
package main import "fmt" // copy func main() { a1 := []int{1,3,5} a2 := a1 // 赋值 // var a3 []int // nil var a3 = make([]int, 3, 3) copy(a3, a1) // copy fmt.Println(a1, a2, a3) a1[0] = 100 fmt.Println(a1, a2, a3) // 将a1中的索引为1的3这个元素删除 a1 = append(a1[:1], a1[2:]...) fmt.Println(a1) fmt.Println(cap(a1)) x1 := [...]int{1, 3, 5} // 数组 s1 := x1[:] fmt.Println(s1, len(s1), cap(s1)) // 1. 切片不保存具体的值 // 2. 切片对应一个底层数组 // 3. 底层数组都是占用一块连续的内存 fmt.Printf("%p\n", &s1[0]) s1 = append(s1[:1], s1[2:]...) // 修改了底层数组! fmt.Printf("%p\n", &s1[0]) fmt.Println(s1, len(s1), cap(s1)) // ? // s1[0] = 100 // 修改底层数组 fmt.Println(x1) // [1 5 5] }
练习题
package main import ( "fmt" "sort" ) // 切片的练习题 func main() { var a = make([]int, 5, 10) // 创建切片 长度为5 容量为10 fmt.Println(a) // [0 0 0 0 0] for i := 0; i < 10; i++ { a = append(a, i) } fmt.Println(a) // [0 0 0 0 0 0 1 2 3 4 5 6 7 8 9] fmt.Println(cap(a)) // sort排序 var a1 = [...]int{3, 7, 8, 9, 1} sort.Ints(a1[:]) // 对切片进行排序 fmt.Println(a1) }