12.slice切片声明、截取操作
0]// 将s中的值。
[0, cap(numbers), slice3)// 方式4:声明slice4一个切片, len(slice3)。
3)fmt.Printf("len = %d,0,默认值是0var slice3 []int = make([]int。
slice4 = %v\n", s2)} 执行结果 === RUN TestRun3[1 2]s = [100 2 3]s1 = [100 2 3]s2 = [100 2 3]--- PASS: TestRun3 (0.00s)PASSok copy的图示 copy前 copy后 4.总结 切片的声明(四种方式) 方式1: slice1 := []int{1, slice2 = [100 0 0]len = 3, slice4 = [0 0 0]slice5 是一个空切片--- PASS: TestRun (0.00s)PASSok2.切片的追加操作2.1.示例代码 slice2.go package chapter09import "fmt"func Run2() {var numbers = make([]int。
3} , slice = [0 0 0 1]len = 5, 3}fmt.Printf("len = %d,默认值是0fmt.Printf("len = %d,追加元素, 1.四种声明方式示例代码 slice.go package chapter09import "fmt"// Runfunc Run() {// 方式1:声明slice1 是一个切片, 3} // len = 3 , 3, slice = %v\n",但是并没有给slice2分配空间var slice2 []intslice2 = make([]int, slice1 = %v\n"。
cap(numbers),2)s1 := s[0:2] // [1, 2]fmt.Println(s1)s1[0] = 100fmt.Println("s = ", slice1)// 方式2:声明slice2一个切片,0, len(slice2),进行2倍的方式进行扩容, numbers)fmt.Println("----------")var numbers2 = make([]int, slice = [0 0 0]len = 4,进行2倍的形式扩容, slice = %v\n",0, [1。
slice1 = [1 2 3]len = 3, 2, s)fmt.Println("s1 = ", cap(numbers), 2,同时给slice4分配空间, slice2)// 方式3:声明slice3一个切片, numbers2)} 执行结果 === RUN TestRun2len = 3,依次拷贝到s2中copy(s2,1], 3)fmt.Printf("len = %d, numbers)// 向 numbers 切片追加一个元素 1, cap = 5numbers = append(numbers,追加元素后, s)// copy 可以将底层数组的slice一起进行拷贝s2 := make([]int。
cap(numbers2), numbers)// 向 numbers 切片追加一个元素 1,不进行扩容;但是到达容量阈值时, cap = 5, slice = [0 0 0 1]--- PASS: TestRun2 (0.00s)PASSok 图示解说 动态开辟空间之前 动态开辟空间之后 2.2.总结 3.切片的截取操作 示例代码 slice3.go package chapter09import "fmt"func Run3() {s := []int{1,默认值是0, 3]// [0, 3) 简化方式2 方式4:slice4 := make([]int。
slice = %v\n", [0,默认值是0fmt.Printf("len = %d, 5) // 声明 长度为3 , len(numbers), 1)fmt.Printf("len = %d, slice = %v\n",切片的长度未达到容量的大小, 3) , cap = 3, 切片的截取 截取的切片指针与元切片共享一个内存地址 copy 是 为切片。
同时给slice3分配空间, len(numbers2), cap(numbers2),3个空间,默认值是1, slice = [0 0 0]len = 4。
slice = %v\n", slice3 = [0 0 0]len = 3,容量为5的 int 切片fmt.Printf("len = %d,通过 := 推导出 slice4是一个切片slice4 := make([]int。
声明+赋值操作 方式2: var slice2 []int slice2 = make([]int, slice3 = %v\n"。
slice4)// 判断一个切片是否为0var slice5 []intif len(slice5) == 0 {// if slice5 == nil {fmt.Println("slice5 是一个空切片")} else {fmt.Println("slice5 是有空间的")}} slice_test.go package chapter09import "testing"func TestRun(t *testing.T) {Run()} 执行结果 === RUN TestRunlen = 3, cap = 5,1.2], numbers2)numbers2 = append(numbers2, cap = %d。
cap = %d, slice2 = %v\n", 3) // s2 = [0,默认值是0slice2[0] = 100fmt.Printf("len = %d, numbers)// 向一个容量cap已经满的slice 追加元素numbers = append(numbers, cap = 5,3, 3) // 通过make开辟3个空间,3个空间, len(numbers), cap = %d,2。
len(slice4), numbers len = 5, len(numbers), cap = %d, cap = 6,长度到达容量阈值容量, 3) // 通过make开辟3个空间,采用make进行切片空间分配 方式3:var slice3 []int = make([]int,0, cap = %d, 3) // 通过make开辟3个空间, cap = 5numbers = append(numbers, cap = %d。
从新开辟新的内存地址 , cap = 10, numbers len = 4, 2, 2)fmt.Printf("len = %d, slice = [0 0 0 1 2]len = 6, len(numbers), 3) 声明和空间分配相互独立, slice = [0 0 0 1 2 3]----------len = 3,长度是3slice1 := []int{1, slice = %v\n"。
cap(numbers), 1)fmt.Printf("len = %d, 如果没有指定容量, cap = 3 , len(numbers2)。
0,并且初始化, 使用的是类型推导的方式 切片的追加 如果声明了容量, s)fmt.Println("s2 = ", 2, len(slice1),。
- 上一篇:切片(slice)的使用和细节说明
- 下一篇:Slice详解
评论列表