切片表达式
arr[low:high]
切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的low和high表示一个索引范围(左包含,右不包含),得到的切片长度=high-low,容量等于得到的切片的底层数组的容量。
res:=[]int{1,2,3,4}
a:=res[:3]
fmt.Printf("%v\n",res)
fmt.Printf("len:%d,cap:%d\n",len(a),cap(a))
//输出 [1 2 3]
//len:3,cap:4
对一个切片进行重新切片,会共享同一个底层数组
res:=[]int{1,2,3,4}
a:=res[:3]
a=append(a,5)
fmt.Printf("%v\n",res)
//输出
//[1 2 3 5]
可以看到在经过append之后的切片res
与原来不一样了。
出现这样的问题,是因为经过切片表达式得到的切片与原来的切片共用同一底层数组。在进行append()操作后,底层数组发生了变化,所以res
也和原来不一样了,如下:
res:=[]int{1,2,3,4}
fmt.Printf("res:%p\n",res)
a:=res[:3]
fmt.Printf("a:%p\n",a)
//输出
// res:0xc00000e360
// a:0xc00000e360
想要避免这样的问题可以重新创建一个切片,在新切片上增加元素:
res:=[]int{1,2,3,4}
a:=res[:3]
temp:=make([]int,len(a))
copy(temp,a)
temp=append(temp,5)
fmt.Printf("temp:%v\n",temp)
fmt.Printf("res:%v\n",res)
//输出
// temp:[1 2 3 5]
// res:[1 2 3 4] 没有改变res
同时如果在此时再增加一个元素
res:=[]int{1,2,3,4}
a:=res[:3]
a=append(a,5)
a=append(a,5)
fmt.Printf("%v\n",res)
注意:
这里新
总结
- 基于数组通过切片表达式得到切片
- 左包含,右不包含