【问题标题】:Golang panic: runtime error: index out of range only happens when run outside debuggerGolang 恐慌:运行时错误:索引超出范围仅在调试器外部运行时发生
【发布时间】:2015-07-30 07:50:14
【问题描述】:

我有以下代码用于在给定切片中查找两个整数之和为给定总数:

type Store_object struct {
    C      int
    I      int
    Prices []int
}
//..other unrelated functions...

func FindItemPairs(scenarios []Store_object) ([]string, error) {
    var results []string
    for scIndex := 0; scIndex < len(scenarios); scIndex++ {
        scenario := scenarios[scIndex]
        for prIndex := 0; prIndex < len(scenario.Prices); prIndex++ { //<--!sc
            firstItem := scenario.Prices[prIndex]
            if firstItem >= scenario.C {
                continue
            }
            for cmpIndex := prIndex + 1; cmpIndex < len(scenario.Prices); cmpIndex++ {
                secondItem := scenario.Prices[cmpIndex]

                switch {
                case secondItem >= scenario.C:
                    continue
                case firstItem+secondItem == scenario.C:
                    result := "Case #" + strconv.Itoa(scIndex+1) +
                        " " + strconv.Itoa(firstItem) + " " +
                        strconv.Itoa(secondItem)
                    results = append(results, result)
                }
            }
        }
   }
   return results, nil
}

但是,当我尝试运行代码来查找项目对时,我收到以下错误:

panic: runtime error: index out of range

goroutine 1 [running]:
   <store_credit>.FindItemPairs(0x208208000, 0x1e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0)
<store_credit_location>.go:76 +0x4ac 
main.main()
    <main_dir>/test_sc.go:16 +0x24d
exit status 2

(相关行在上面用

为了尝试调试,我使用下面的项目https://github.com/mailgun/godebug进行测试,发现我的代码执行没有问题。

我目前不知道如何访问超出范围的值,但不知道如何进一步调试...

任何有关这方面的指导将不胜感激!

有关更多上下文,这是我正在尝试实现的代码堵塞:https://code.google.com/codejam/contest/351101/dashboard#s=p0

编辑:对于更多上下文,这是我正在运行的调用此函数的主文件:

func main() {
    cases, err := store_credit.ReadLines("A-small-practice.in")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(cases)

    results, err := store_credit.FindItemPairs(cases) //<--!main
    if err != nil {
        fmt.Println(err)
    }

    for i := 0; i < len(results); i++ {
        fmt.Println(results[i])
    }
}

ReadLines 工作正常,没有任何问题。

【问题讨论】:

  • 这是唯一可以访问 scenarios 的 goroutine,还是恐慌时它的任何项目?
  • 你确定第 76 行标有&lt;--! 吗?我希望之前或之后的行超出范围,但for 行不超出范围。
  • @captncraig 评论 1:我很确定,因为我没有尝试生成任何 goroutine。我正在导入此代码并从另一个源文件(我的主源)调用该函数,但我的主函数不应访问其任何内部变量。评论 2:每当我运行它时,它都会告诉我这句话。在这方面我和你一样困惑。

标签: go indexoutofrangeexception


【解决方案1】:

您似乎在某处发生了数据竞争。尝试使用 -race 标志运行它。

运行 -race myfile.go

【讨论】:

  • 好的,所以添加这个标志让它运行没有问题(比如在调试器中运行它)但我仍然不确定问题的根源在哪里......对不起,我是新人去,所以我还在学习如何正确调试它。我查看了 -run 文档,当我使用 -race 运行时没有显示任何警告,它似乎可以正常工作。
猜你喜欢
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多