- 一.截取子切片
- 切片可以通过指定索引区间获得1个子切片
- 切片规则: clice[start:end],规则是前包后不包
- start不写为0
- end默认为len(slice)长度,如果写可以不是长度值
- start,end不能超过容量值
- len截取段的元素个数,end-start
- cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量
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.子切片:用底层数组部分元素。不会导致扩容,共用1个底层数组
//3.构造1个新header,不构造新的底层数组
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.偏移8byte(1个元素),首地址改变,s4看不到第一个元素,len=4,cap=4
//3.用底层数组部分元素。不会导致扩容,共用1个底层数组
//4.构造1个新header,不构造新的底层数组
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.偏移8byte(1个元素),首地址改变;
// 3.len=截取段的元素个数,end-start=3;
// 4.cap从header中的pointer指针开始向底层数组末尾数,还有几个元素容量=4
fmt.Printf("s5 标量值地址:%p |标量值:%p %d, %d|, %v \n", &s5, &s5[0], len(s5), cap(s5), s5)
结果
5.掐头
标签:截取,cap,len,s4,切片,标量,wee3,s1
From: https://www.cnblogs.com/john5yang/p/17033332.html