Паника в Golang: ошибка времени выполнения: индекс вне диапазона происходит только при запуске вне отладчика

У меня есть следующий код, используемый для поиска двух целых чисел, которые в сумме дают заданную сумму в данном срезе:

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

(соответствующая строка отмечена ‹--!sc сверху и ‹--!main снизу)

Чтобы попытаться отладить, я использовал следующий проект 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 работает без проблем.


person jtgoen    schedule 29.07.2015    source источник
comment
Это единственная горутина, которая может получить доступ к scenarios или любому из его элементов во время паники?   -  person captncraig    schedule 29.07.2015
comment
Вы уверены, что строка 76 отмечена <--!? Я бы ожидал выхода за пределы диапазона либо в строке до, либо после, но не в строке for.   -  person captncraig    schedule 29.07.2015
comment
@captncraig Комментарий 1: Я почти уверен, так как я не пытаюсь создавать какие-либо горутины. Я импортирую этот код и вызываю эту функцию из другого исходного файла (мой основной источник), но моя основная функция не должна обращаться ни к одной из своих внутренних переменных. Комментарий 2: это строка, о которой он говорит мне всякий раз, когда я ее запускаю. Я так же смущен, как и вы на этом фронте.   -  person jtgoen    schedule 30.07.2015


Ответы (1)


Похоже, у вас может быть гонка данных где-то. Попробуйте запустить его с флагом -race.

иди беги -race myfile.go

person Joshua    schedule 29.07.2015
comment
Итак, добавление этого флага позволяет ему работать без проблем (например, запускать его в отладчике), но я все еще не уверен, где источник проблемы... Извините, я новичок в Go, поэтому я все еще научиться правильно отлаживать его. Я просмотрел документы -run, и при запуске с -race никаких предупреждений не появляется, просто кажется, что это работает. - person jtgoen; 30.07.2015