一、创建切片的几种方式
-
1、直接定义
var slice1 []int = []int{1,2,3,4} var slice2 = []string{"张三", "李四"} slice3 :=[]bool{true, false}
-
2、使用
make
函数来创建// 使用make定义的时候可以传递三个参数, // 第一个是切片的数据类型 // 第二个参数是切片的长度 // 第三个参数是切片的容量 可选的如果不写默认和长度一样的 var slice1 = make([]int,2)
-
3、数组转换为切片
numAry := [10]int{0,1,2,3,4,5,6,7,8,9} // 这样切片是全部切,切片和python中一样的左闭右开的原则 slice1 := numAry[:] fmt.Printf("%T-%T",numAry, slice1)
-
4、使用
new
函数来创建slice1 := new([]int) fmt.Printf("%T", slice1)
二、切片的几个现状
-
1、使用
make
声明切片的时候如果长度没有是不能拷贝数据进去的,有几个长度就能拷贝几个元素进去a := make([]int,0) b := []int{1,2,3,4} // 将b中的数据拷贝到a中 copy(a,b) fmt.Println(a,b)
-
2、长度为0的切片使用
append
却可以添加进去元素,因为切片的自动扩容机制所致a := make([]int,0) a = append(a, 10) fmt.Println(a)
-
3、切片是地址引用的方式
b := []int{1,2,3,4} // 快速的拷贝一份副本 c := b[:] c[0] = 10 // 这里b和c都会被修改 fmt.Println(b,c)
-
4、在3的基础上使用
append
的时候却不会相互影响b := []int{1,2,3,4} // 快速的拷贝一份副本 c := b[:] c[0] = 10 fmt.Println(b,c) c = append(c, 20) fmt.Println(b,c)
原因使用
append
开始的切片容量不够的时候,就会自动扩容,扩容后就是一个新的切片地址了,因为切片的底层也是一个数组package main import "fmt" func main() { b := []int{1,2,3,4} // 快速的拷贝一份副本 c := b[:] c[0] = 10 fmt.Println(b,c) fmt.Printf("开始b切片:%d-%d\n", len(b), cap(b)) fmt.Printf("开始c切片:%d-%d\n", len(c), cap(c)) c = append(c, 20) fmt.Println(b,c) fmt.Printf("结束的b切片:%d-%d\n", len(b), cap(b)) fmt.Printf("结束的c切片:%d-%d\n", len(c), cap(c)) }
三、切片常见的方法
-
1、长度和容量
-
2、切片的遍历
package main import "fmt" func main() { b := []int{1,2,3,4,5,6,7,8,9} for index, value := range b { fmt.Println(index, value) } }
-
3、使用
append
添加元素package main import "fmt" func main() { b := []int{1,2,3,4} c := []int{5,6,7,8,9} // 直接添加一个元素 c = append(c,0,20) // 添加一个切片要用...展开运算符 c = append(c, b...) fmt.Println(c) }
-
4、删除一个元素
package main import "fmt" func main() { c := []int{5,6,7,8,9} d := make([]int,0) d = append(c[:2], c[3:]...) fmt.Println(d) }
四、切片的扩容机制
-
1、演示代码
package main import "fmt" func main() { a := make([]int, 0) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,1) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,2) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,3) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,4) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,5) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,6) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,7) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,8) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) a = append(a,9) fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a)) }
-
2、运行结果
当前切片的长度:0,容量:0 当前切片的长度:1,容量:1 当前切片的长度:2,容量:2 当前切片的长度:3,容量:4 当前切片的长度:4,容量:4 当前切片的长度:5,容量:8 当前切片的长度:6,容量:8 当前切片的长度:7,容量:8 当前切片的长度:8,容量:8 当前切片的长度:9,容量:16
-
3、总结
- 如果容量小于1024的时候,是成倍数的添加容量
- 如果容量大于1024的时候,是之前的1/4的来添加容量