“index out of range” в Go

Манипулируя arraysв Go я понимаю, что существуют два способа объявлять их.

Сформируй 1

Когда заявил array с установленным размером

var a [5]int

a[0] = 1

Предыдущее не дает никакой проблемы.

Сформируй 2

Когда заявил array без размера.

var b []int

Предыдущее не дает никакой проблемы, но когда я пробую распределять ему стоимость, я схватил:

b[0] = 1

У меня появляется эта ошибка:

panic: runtime error: index out of range
goroutine 1 [running]:
panic(0x5fb80, 0xc82000a0a0)
    /usr/local/go/src/runtime/panic.go:464 +0x3e6
main.main()
    /Users/my/path/main.go:8 +0x38
exit status 2

Почему у меня появляется эта ошибка?

Они ощутятся, что сообщение ошибки немного смущено ввиду того, что он говорит goroutines, вещь, которую я не использую все еще и (я не знаю, какой звук, только я знаю, что они существуют).

1
задан 24.03.2016, 06:32
1 ответ

В действительности не существуют два способа объявлять договоренность в go, только есть форма, и - первая двух, которые в примере он описывает:

var a [5]int

В go, длина договоренности всегда должна делать часть Вашего типа, это благодаря тому, что эта структура данных во время выполнения никогда не будет менять Ваш размер, следовательно синтаксис, чтобы объявлять договоренность:

var name [length]T

где length должен быть постоянной величиной типа int не отрицание и T - тип информации, которую он будет содержать. Как только была создана договоренность 5 элементов типа int, инициализировать одно из этих полей - просто, формы, в которой Вы это реализовали:

a[0] = 1

Сейчас, во второй форме, которую Вы описываете, не объявляй договоренность, потому что нет длины, а структуры данных так называемый slice. Смоги думать о ней как структура, которую имеет суфлер по отношению к договоренности и длине. Одна из нескольких форм, slice заявляет, - поскольку Вы это реализует в форме два:

var b []int

В предыдущей инструкции, заявляет так называемый slice b что укажет на договоренность типа int. Сравнивая с синтаксисом, объявив договоренность, если не определяется стоимость length, go пойми, что Вы создаете slice. Сейчас, согласно Вашему примеру, Вы только объявили переменную b типа int, но сейчас будь должен инициализировать ее, иначе стоимость этой переменной будет nil (тип очень сходной информации в null на договорных языках программирования).

Чтобы инициализировать стоимость slice возможная форма состоит в том, чтобы использовать функцию make(). Эта получает как параметр тип информации, которую он хочет построить, начальная длина этого и опциональный параметр, который показывает максимальную стоимость, в которую он может расширять способность slice, как он поймет, эта структура да позволяет расширять, или уменьшаться, динамической формы длина договоренности. Следовательно, в Вашу форму ему не хватает 2 инструкция:

//Construyo un slice de longitud inicial 5 y longitud máxima 10.
b = make([]int, 5, 10)

И сейчас да, смоги заставлять распределять стоимость slice

b[0] = 1

Ошибка, показанная, выполнив код, - что-то темное, потому что в действительности за slice всегда будет договоренность, уже состойте в том, что он верит в это с функцией make() или что это построил начиная с договоренности, которую уже он создал бы (как договоренность a в Вашем коде). В любом случае, согласно Вашей форме 2, начальная длина slice - nil, и когда 0 из этого slice ссылается на объект, он произведет один index out of range и не ошибка, сходная с исключениями как NullPointerException в Java, потому что в действительности nil только он ссылается на стоимость переменных, которые не инициализируются.

На связи с goroutine

goroutine - функция, которая работает конкурирующей формы в трэд главного выполнения. Если он запрограммировал в Java, смоги думать о, что похожие на концепцию Threads, если не, он думал об этом: Ваша главная программа (трэд главного выполнения) - Ваш main, или который он выполняет, когда он скроллирует программу, которая содержит код, в котором он нуждается. Эта программа может "уполномочивать" задания для того, чтобы они работали конкурирующей формы (в то же время) то, что главная программа. В go, Вы этого добиваетесь через goroutine. Из-за Вашей публикации покажи, что у него нет опыта в этой теме, так что я приглашаю это искать больше на этой красивой функции go. Относительно Вашего сомнения, когда программа находит, что он пробует согласиться на элемент договоренности, которая не существует, он бросает ошибку типа 'index out of range'. В go, эта ошибка производит призыв к функции panic, что рождает преждевременно выполнение программы. Когда в Вашей разметке он показывает, что ошибка произошла в goroutine, 1 показывает его в каком трэде выполнения породилась эта ошибка, но только есть один: главный, который выполнен всегда как goroutine через метод main.go, когда он бросает программу.

4
ответ дан 24.11.2019, 14:41
  • 1
    Спасибо за ответ, у меня остается сомнение в и # 250; n из-за qu и # 233; появляются " goroutines" в сообщении ошибки, и #191; они имеют что-то общее? – Gepser 24.03.2016, 16:45
  • 2
    @Gepser, в и # 241; ad и # 237; ответ как actualizaci и # 243; n publicaci и # 243; n ввиду него extensi и # 243; n. – dwarandae 24.03.2016, 19:40
  • 3
    спасибо за explicaci и # 243; n дополнительный. – Gepser 04.04.2016, 18:35
  • 4
    как прокомментируй dwanrandae, нужно отличаться много между arrays и slides, первые всегда ты признаешь их длиной, в то время как slice в него будут верить по-другому, в общем всегда ты используешь append для в и # 241; adirle элементы в slice. Здесь я оставляю тебе ссылки, где они показывают примеры Арраис & Slices Array : gobyexample.com/arrays Slice : gobyexample.com/slices типов Привета – kiramishima 07.04.2016, 00:01

Теги

Похожие вопросы