英文:
Golang panic: runtime error: index out of range
问题
这个函数接受一个包含一些整数的数组,我的目标是得到一个只包含正整数的新数组:
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
}
然而,我一直得到相同的错误,提示出现了恐慌:
运行时错误:索引超出范围
英文:
This function takes an array with some integers and my goal is to have a new array with just positive integers:
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
}
However, I keep getting the same error saying panic:
> runtime error: index out of range
答案1
得分: 2
那个实现的问题在于它在第一个if块内部递增了i,然后使用新的i值来检查第二个if块中的newarray[i] >= 0,所以当你使用x = len(a)-1调用domath(a, x, b)时,它尝试执行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
}
英文:
The problem with that implementation is that it's incrementing i inside the first if block and then using the new i value to check newarray[i] >= 0 on the second if block, so when you call domath(a, x, b) with x = len(a)-1 it tries to do newarray[x+1] (i.e. newarray[len(newarray)]) which is out of bounds.
You probably meant to write something like:
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
}
A simplified version of your algorithm could be:
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)
}
Yet you should probably be using an implementation more idiomatic like the following one, which will also be faster:
func domath(ns []int) []int {
var ps []int
for _, n := range ns {
if n >= 0 {
ps = append(ps, n)
}
}
return ps
}
答案2
得分: 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)
}
英文:
Do you want write a recursive function?, you can see my code below :
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)
}
答案3
得分: 0
我解决了这个问题。这是一个简单但常见的错误。出现 golang panic 错误是因为我们忘记了"创建一个切片或数组"。例如:
package main
import "fmt"
func main() {
var elementNumber int
fmt.Println("你想要多少个元素?")
fmt.Scanln(&elementNumber)
storage := make([]int, elementNumber) // 这一行非常重要。
for i := 0; i < elementNumber; i++ {
fmt.Printf("请输入第 %d 个整数:", i+1)
fmt.Scanln(&storage[i])
}
}
如果我不使用"make",而是像下面这样写,它将无法工作:
package main
import "fmt"
func main() {
var elementNumber int
fmt.Println("你想要多少个元素?")
fmt.Scanln(&elementNumber)
storage := []int{}
for i := 0; i < elementNumber; i++ {
fmt.Printf("请输入第 %d 个整数:", i+1)
fmt.Scanln(&storage[i])
}
}
英文:
I solved this problem. It is simple but common mistake. The golang panic error coming out because of we missing the "make a slice or array". for example
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])
}
}
If I could have do instead this and do not use "make",it would have not work ;
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])
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论