简析使用索引区间得到的切片

在Go语言中,可以通过索引来获取切片(slice)中的特定区间的元素。切片是一个动态数组,它提供了一种方便的方式来操作一组数据。使用索引区间可以获取切片中一段连续的元素,这在很多情况下都非常有用。

定义

基本语法

1
slicedData := originalSlice[startIndex:endIndex]
  • startIndex 是起始索引(包含)。
  • endIndex 是结束索引(不包含)。

注意事项

  • 起始索引和结束索引必须在切片的有效索引范围内。
  • 如果省略 startIndex,则默认为 0。
  • 如果省略 endIndex,则默认为切片的长度(包含最后一个元素)。
  • 如果 startIndex 大于 endIndex,则返回一个空切片。
  • 使用索引区间得到的切片与原始切片共享底层数组。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func main() {
    originalSlice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    // 获取索引为1到4的元素
    slicedData := originalSlice[1:5]
    fmt.Println("Sliced Data:", slicedData) // Output: [2 3 4 5]

    // 使用索引区间得到的切片与原始切片共享底层数组
    slicedData[0] = 100
    fmt.Println("Original Slice:", originalSlice) // Output: [1 100 3 4 5 6 7 8 9 10]
}

在这个示例中,我们首先创建了一个原始切片 originalSlice,然后使用索引区间来获取不同的切片。可以看到,通过不同的索引区间我们可以得到原始切片的不同子集。

需要注意的是,对通过索引区间得到的切片的修改会影响到原始切片。

切片的容量

1
2
3
4
5
6
7
func main() {
	originalSlice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	slicedData := originalSlice[1:5]
	fmt.Println("Sliced Data:", slicedData)       // Output: [2 3 4 5]
	fmt.Println(slicedData[4])                    // panic: runtime error: index out of range [4] with length 4
	fmt.Println(len(slicedData), cap(slicedData)) // 4 9
}

由于索引区间得到的切片与原始切片共享底层数组,所以在底层数组中,切片 slicedData 后面的位置的值还是原来的值,只是我们不能通过 slicedData 切片直接访问,但切片的容量为索引的起始位置到底层数组的最后一个元素的个数。

在上面的例子中,originalSlice 的长度为 10,slicedData 切片对原切片进行截取,索引从 1 到 5(不包含),也就是 [2 3 4 5],但切片 slicedData 的长度 9(索引 1 到索引 9 (包含))。

0%