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 @   john5的博客  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css
点击右上角即可分享
微信分享提示