插件窝 干货文章 Go语言切片索引:访问索引1却不会报错,为什么?

Go语言切片索引:访问索引1却不会报错,为什么?

切片 索引 会报 长度 156    来源:    2025-03-13

在Go语言中,切片(slice)是一种动态数组,它提供了对数组的灵活访问。切片的索引从0开始,到len(slice) - 1结束。如果你访问一个超出这个范围的索引,Go语言会在运行时抛出index out of range的panic。

然而,你提到的情况是访问索引1却没有报错,这可能有以下几种原因:

  1. 切片长度足够: 如果你访问的索引1在切片的有效范围内(即切片的长度至少为2),那么访问索引1是合法的,不会报错。

    s := []int{10, 20, 30}
    fmt.Println(s[1]) // 输出 20,不会报错
    
  2. 切片长度为1: 如果切片的长度为1,那么访问索引1就会超出范围,应该会报错。如果你没有看到报错,可能是因为你在访问索引1之前没有检查切片的长度,或者你在调试时忽略了错误。

    s := []int{10}
    fmt.Println(s[1]) // 运行时 panic: index out of range
    
  3. 切片为空: 如果切片为空(长度为0),访问任何索引都会导致index out of range的panic。

    s := []int{}
    fmt.Println(s[1]) // 运行时 panic: index out of range
    
  4. 切片重新分配: 如果你在访问索引1之前对切片进行了重新分配(例如通过append操作),可能会导致切片的长度发生变化,从而使得索引1变得合法。

    s := []int{10}
    s = append(s, 20)
    fmt.Println(s[1]) // 输出 20,不会报错
    
  5. 切片是nil: 如果切片是nil,访问任何索引都会导致index out of range的panic。

    var s []int
    fmt.Println(s[1]) // 运行时 panic: index out of range
    

总结

访问切片索引1不会报错的前提是切片的长度至少为2。如果切片的长度不足,访问索引1会导致index out of range的panic。如果你没有看到报错,可能是因为切片的长度足够,或者你在调试时忽略了错误。

建议在访问切片索引之前,先检查切片的长度,以避免运行时错误:

if len(s) > 1 {
    fmt.Println(s[1])
} else {
    fmt.Println("切片长度不足")
}