Golang恐慌:运行时错误:索引超出范围

时间:2016-12-28 05:51:36

标签: go runtime 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 
}

3 个答案:

答案 0 :(得分:2)

该实现的问题在于它在第一个if块内递增i然后使用new i值在第二个if块上检查newarray [i]&gt; = 0,所以当你调用domath时(a,x,b)x = len(a)-1它试图做新的[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
}

答案 1 :(得分:0)

你想写一个递归函数吗?你可以在下面看到我的代码:

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

}

答案 2 :(得分:0)

我解决了这个问题。这是一个简单但常见的错误。由于我们错过了“制作切片或数组”,因此出现了 golang 恐慌错误。例如

package main

import "fmt"

func main() {
    var elementNumber int
    fmt.Println("How many elements do you want in slice?")
    fmt.Scanln(&elementNumber)

    storage := make([]int, elementNumber) // this line crucial important.
    for i := 0; i < elementNumber; i++ {
        fmt.Printf("please enter %d. integer number= ", i+1)
        fmt.Scanln(&storage[i])
    }
}

如果我可以这样做并且不使用“make”,它就行不通;

package main

import "fmt"

func main() {
    var elementNumber int
    fmt.Println("How many elements do you want in slice?")
    fmt.Scanln(&elementNumber)

    storage := []int{}
    for i := 0; i < elementNumber; i++ {
        fmt.Printf("please enter %d. integer number= ", i+1)
        fmt.Scanln(&storage[i])
    }
}

enter image description here