You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言切片排序代码触发panic: runtime error: index out of range求助

解决Go语言排序代码的索引越界Panic问题

我一眼就看到问题所在了——你遇到的panic: runtime error: index out of range是因为数组索引越界,咱们一步步拆解和修复:

1. 直接触发Panic的原因

你的代码里用了for i := range l遍历切片,这会覆盖切片的所有索引(从0到len(l)-1)。当i走到最后一个元素的索引时,n := i + 1就等于len(l),而切片的最大合法索引是len(l)-1,这时候访问l[n]必然会触发索引越界panic。

2. 代码里的其他逻辑问题

除了索引越界,你的代码还有几个可以优化的点:

  • 全局变量arr和d的使用非常不推荐,会让排序函数变得不可靠(比如多次调用时会互相干扰),也不符合Go语言的函数设计规范。
  • 递归逻辑混乱:你想通过递归重复排序直到没有交换,但当前的递归触发条件(d == false)逻辑绕弯,而且参数n完全没用到。
  • 返回值用interface{}没必要,直接返回[]int更符合类型安全的要求。

3. 修复后的代码(标准冒泡排序迭代版)

我给你改成了更清晰、高效的迭代式冒泡排序,彻底解决索引问题,同时去掉全局变量:

func bubbleSort(l []int) []int {
    // 先复制原切片,避免修改输入的原始切片
    sorted := make([]int, len(l))
    copy(sorted, l)
    
    length := len(sorted)
    swapped := true
    
    for swapped {
        swapped = false
        // 关键:循环到len(sorted)-2,确保i+1不会越界
        for i := 0; i < length-1; i++ {
            if sorted[i] > sorted[i+1] {
                // Go语言可以直接交换两个变量,不需要临时变量t
                sorted[i], sorted[i+1] = sorted[i+1], sorted[i]
                swapped = true
            }
        }
        length-- // 每轮都会把最大的元素移到末尾,下一轮不需要再比较它
    }
    return sorted
}

4. 如果要保留递归思路(不推荐,仅贴合你的原始逻辑)

如果你坚持想用递归实现,也可以修正索引问题并简化逻辑:

// 注意:递归实现冒泡排序效率较低,仅作演示用
func sortWithRecursion(l []int) []int {
    sorted := make([]int, len(l))
    copy(sorted, l)
    swapped := false
    
    // 限制循环范围,避免索引越界
    for i := 0; i < len(sorted)-1; i++ {
        if sorted[i] > sorted[i+1] {
            sorted[i], sorted[i+1] = sorted[i+1], sorted[i]
            swapped = true
        }
    }
    
    // 如果有交换发生,继续递归排序;否则返回结果
    if swapped {
        return sortWithRecursion(sorted)
    }
    return sorted
}

总结

核心问题就是循环范围没有限制导致索引越界,解决它的关键是让i的最大值为len(l)-2,确保i+1不会超出切片的合法索引范围。另外,尽量避免全局变量,迭代版本的排序逻辑比递归更高效易懂。

内容的提问来源于stack exchange,提问作者Jul Kreshpaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:48:15