4week-1截取子切片

  • 一.截取子切片
  1. 切片可以通过指定索引区间获得1个子切片
  2. 切片规则: clice[start:end],规则是前包后不包
    1. start不写为0
    2. end默认为len(slice)长度,如果写可以不是长度值
    3. start,end不能超过容量值
    4. len截取段的元素个数,end-start
    5. cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量

len控制各个共同使用底层数组的可见范围
cap没有扩容之前还有几个位置可用
首地址觉得容量还有多少,如果首地址偏移1,容量就会-1,偏移2,容量就会-2

子切片:有没有肯构造一个新的底层数组? 我用的是你部分元素,不会导致扩容,共用1个底层数组

1.复习:

// 切片可以通过指定索引区间获得1个子切片,格式位clice[start:end],规则是前包后不包
func main() {
  s1 := []int{10, 30, 50, 70, 90} //字面定义1个切片,len=5 cap=5
  fmt.Printf("s1 标量值地址:%p |标量值:%p %d, %d|, %v \n", &s1, &s1[0], len(s1), cap(s1), s1)
    for i, _ := range s1 {
      fmt.Println(i, &s1[i])
    }

  s2 := s1
  fmt.Printf("s2 %p |标量值:%p %d, %d|, %v \n", &s2, &s2[0], len(s2), cap(s2), s2)
}

  • 结果:

2.子切片---全切-以下子切片不撑爆底层数组

s3 := s1[:]
        //1.全切 [10 30 50 70 90]
	//2.新header
	//3.不偏移
	//4.len=截取段的元素个数,end-start=		5-0=5;
	//5.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量		0-->4=4
	fmt.Printf("s3 标量值地址:%p |标量值:%p %d, %d|, %v \n", &s3, &s3[0], len(s3), cap(s3), s3)

3.切片去头

	s4 := s1[1:] //[1:5]
	//1.去头 [30 50 70 90]
	//2.新header
	//3.偏移8byte(1个元素),首地址 变 了,s4看不到第一个元素
	//4.len=截取段的元素个数,end-start=		5-1=4;
	//5.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量		1-->4=4
	fmt.Printf("s4 标量值地址:%p |标量值:%p %d, %d|, %v \n", &s4, &s4[0], len(s4), cap(s4), s4)

结果

4.切片去头去尾

	s5 := s1[1:4] //去头去尾
	// 1.底层数组[10 30 50 70 90] 掐头去10, 去尾90 [30 50 70]
	// 2.新header
	// 3.偏移8byte(1个元素),首地址 变 了;
	// 4.len=截取段的元素个数,end-start=	4-1=3;
	// 5.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量	1-->4=4
	fmt.Printf("s5 标量值地址:%p |标量值:%p %d, %d|, %v \n", &s5, &s5[0], len(s5), cap(s5), s5)

结果

5.去尾

	s6 := s1[:4] //去尾
	// 1.底层数组[10 30 50 70 90] 掐头去10, [10 30 50 70]
	// 2.新header
	// 3.不偏移
	// 4.len=截取段的元素个数,end-start=	4-0=4;
	// 5.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量	0-->4=5
	fmt.Printf("s6 标量值地址:%p |标量值:%p %d, %d|, %v \n", &s6, &s6[0], len(s6), cap(s6), s6)

结果

6.切片长度为0空切片,长度为0不能访问--1

	s7 := s1[1:1]
	// 1.底层数组[10 30 50 70 90] 掐头去10, 去尾10 30 50 70 90
	// 2.新header
	// 3.偏移8byte(1个元素)首地址 变 了;
	// 3.len=截取段的元素个数,end-start=	1-1=0;
	// 4.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量	1-->4=4
	fmt.Printf("s7 标量值地址:%p |没法显示:p %d, %d|, %v \n", &s7 /* &s7[0],*/, len(s7), cap(s7), s7)

结果

7. 4:4切片问题--2

  • 切片长度为0空切片,长度为0不能访问
![](https://img2023.cnblogs.com/blog/1472910/202301/1472910-20230108000757844-1880955838.png)

s8 := s1[4:4]
	// 1.底层数组[10 30 50 70 90] 掐头10 30 50 70  去尾 90
	// 2.新header
	// 3.偏移32byte(4个元素)首地址 变 了;
	// 3.len=截取段的元素个数,end-start=	4-4=0;
	// 4.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量	第4个元素到-->4=1
	fmt.Printf("s8 标量值地址:%p |没法显示:p %d, %d|, %v \n", &s8 /* &s7[0],*/, len(s8), cap(s8), s8)

结果

8.空切片--3

  • 切片长度为0空切片,长度为0不能访问
s9 := s1[5:5]
	//偏移4个元素,长度0,容量0,类似 []int{}
	fmt.Printf("s9 标量值地址:%p |没法显示:因为s8切完长度为0,go语言不让访问, %d, %d|, %v \n", &s9 /*&s8[0],*/, len(s9), cap(s9), s9)

结果

9.切片append

	s9 = append(s9, 11) //扩容
	fmt.Printf("s9 标量值地址:%p |标量值:%p ,%d, %d|, %v \n", &s9, &s9[0], len(s9), cap(s9), s9)
	s9 = append(s9, 12) //扩容
	fmt.Printf("s9 标量值地址:%p |标量值:%p ,%d, %d|, %v \n", &s9, &s9[0], len(s9), cap(s9), s9)
	s9 = append(s9, 13) //扩容
	fmt.Printf("s9 标量值地址:%p |标量值:%p ,%d, %d|, %v \n", &s9, &s9[0], len(s9), cap(s9), s9)
	s9 = append(s9, 13) //扩容
	fmt.Printf("s9 标量值地址:%p |标量值:%p ,%d, %d|, %v \n", &s9, &s9[0], len(s9), cap(s9), s9)

结果

总结

posted @ 2023-01-07 21:52  john5的博客  阅读(38)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css