嗨,这个函数需要一个带有一些整数的数组,我的目标是有一个只有正整数的新数组。但是,我不断收到相同的错误消息: panic :运行时错误:索引超出范围

有人可以帮我吗?

func domath(newarray[] int, i int, array[] int)([]int){
    if i < len(newarray) {
        if newarray[i] < 0{
            i ++
            domath(newarray, i, array)
        }
        if newarray[i] >= 0 {
            array = append(array, newarray[i])
            i ++
            domath(newarray, i, array)
        }
    }
    return array
}

最佳答案

该实现的问题是它在第一个if块内递增i,然后使用新的i值在第二个if块上检查newarray [i]> = 0,因此当您使用以下命令调用domath(a,x,b)时: x = len(a)-1,它尝试执行超出范围的newarray [x + 1](即newarray [len(newarray)])。

您可能打算写类似:

func domath(newarray []int, i int, array []int) []int {
    if i < len(newarray) {
        if newarray[i] < 0 {
            return domath(newarray, i+1, array)
        }
        if newarray[i] >= 0 {
            array = append(array, newarray[i])
            return domath(newarray, i+1, array)
        }
    }
    return array
}

您的算法的简化版本可以是:
func domath(newarray []int, i int, array []int) []int {
    if len(newarray) == i {
        return array
    }
    if newarray[i] >= 0 {
        array = append(array, newarray[i])
    }
    return domath(newarray, i+1, array)
}

但是,您可能应该使用一种更惯用的实现,例如以下实现,它也会更快一些:
func domath(ns []int) []int {
    var ps []int
    for _, n := range ns {
        if n >= 0 {
            ps = append(ps, n)
        }
    }
    return ps
}

关于go - Golang panic : runtime error: index out of range,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41356117/

10-10 04:32