Go语言slice[a:b:c]用法注意事项

Posted Demonwuwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言slice[a:b:c]用法注意事项相关的知识,希望对你有一定的参考价值。

切片
// 1: 占用资源很小,引用类型
// 2: slice[a:b] 包含a索引值,不包含b索引值,默认容量上界索引为被操作对象容量上界索引
// 3: slice[a:b]的容量默认为被操作对象容量上界索引-a+1
//例如:从[1,2,3,4,5,6,7,8,9] 中取 slice[3,6],容量cap为	9-3+1 = 7
// 4: slice[a:b:c] 包含a索引值,不包含b索引值,容量上界索引为c
// 5:切片后的容量默认为: c-a 
// 例如:从[1,2,3,4,5,6,7,8,9] 中取 slice[3,6:7],容量cap为	7 - 3 = 4
//注意: c的值不能小于b,不能大于被操作对象容量上界
// 6: slice 只能向后扩展,不能向前扩展
// 7: slice append
// (1)某次操作未超过该slice容量上界索引,此次改变会更新原数组;
// (2)某次操作超过该slice容量上界索引则新的被操作对象数组会被新建,此次改变不会更新原数组
func main() {

	numArr := [10]uint{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	slice0 := numArr[3:9]             // 容量上界索引为10
	slice1 := numArr[3:6:7]           // 容量上界索引为8
	
	fmt.Println("slice1 len ==>", len(slice1),"slice1 cap ==>", cap(slice1))

	slice1 = append(slice1, 100)      // 此次 未超过该slice容量上界索引 更新原数组, 不新建数组
	slice1 = append(slice1,  100) // 此次 超过该slice容量上界索引 不更新原数组, 新建数组,容量成倍增加

	for i := 0; i < len(slice0); i++ {
		fmt.Println(i, slice0[i])
	}
	fmt.Println("slice0 len ==>", len(slice0),"slice0 len ==>", cap(slice0))

	for i := 0; i < len(slice1); i++ {
		fmt.Println(i, slice1[i])
	}
	fmt.Println("slice1 len ==>", len(slice1),"slice1 cap ==>", cap(slice1))
}


运行结果:

slice1 len ==> 3 slice1 cap ==> 4
slice1 len ==> 4 slice1 cap ==> 4
0 3
1 4
2 5
3 100
4 7
5 8
slice0 len ==> 6 slice0 len ==> 7
0 3
1 4
2 5
3 100
4 100
slice1 len ==> 5 slice1 cap ==> 8



以上是关于Go语言slice[a:b:c]用法注意事项的主要内容,如果未能解决你的问题,请参考以下文章

详解go语言的array和slice

Go语言中利用append巧妙的删除slice切片中的元素

原来go语言slice切片底层原理这么简单

原来go语言slice切片底层原理这么简单

原来go语言slice切片底层原理这么简单

go语言三个点的用法