Что вызывает панику: ошибка во время выполнения: индекс вне диапазона [4] с длиной 4, даже если массив инициализирован как динамический массив

#arrays #go #indexing #panic

# #массивы #Вперед #индексирование #паника

Вопрос:

Я инициализировал динамический массив, но он показывает индекс вне диапазона. Я также пытался указать фиксированную длину, но она также показывает ту же ошибку. Описание ошибки: паника: ошибка во время выполнения: индекс вне диапазона [4] с длиной 4

 package main
import "fmt"
func missingNumber(nums []int) int {
arrSum := 0
arrLen := len(nums)   1
for i := 0; i < arrLen; i   {
arrSum  = nums[i]
}
numSum := arrLen * (arrLen   1) / 2
missingNumber := numSum - arrSum
return missingNumber
}
func main() {
nums := []int{1, 3, 4, 5}
result := missingNumber(nums)
fmt.Println(result)
}
 

Комментарии:

1. Проблема : arrLen := len(nums) 1 . должно быть только arrLen := len(nums) .

Ответ №1:

вам следует перейти arrLen := len(nums) 1 на arrLen := len(nums) .

Длина вашего массива равна 4. для этого индексы равны 0,1,2,3. но когда вы попытались сделать arrLen := len(nums) 1 . arrlen значение сейчас 5 . но у вас есть только 4 элемента. и из вашего цикла вы пытаетесь получить элемент, которого нет в массиве. это выдаст вам ошибку времени выполнения, и это вызовет панику.

этот будет работать на вас:

 package main
import "fmt"
func missingNumber(nums []int) int {
arrSum := 0
arrLen := len(nums)
for i := 0; i < arrLen; i   {
arrSum  = nums[i]
}
m := arrLen   1
numSum := m * (m   1) / 2
missingNumber := numSum - arrSum
return missingNumber
}
func main() {
nums := []int{1, 3, 4, 5}
result := missingNumber(nums)
fmt.Println(result)
}
 

Ответ №2:

Вот исправление в вашей программе, чтобы найти единственное пропущенное число из последовательности натуральных чисел. Вы индексировали числа массивов [len (nums) 1] за пределами вашего массива. Если разрешено, это должно получить доступ к случайной памяти и прочитать любое значение мусора как законное, и вы даже не узнаете о таких труднодоступных ошибках. Хорошо, что Go проверяет, что вы получаете доступ только к тем элементам в массиве, которые есть, а не за их пределами. Прочитайте это в спецификациях Go

 package main

import "fmt"

func missingNumber(nums []int) int {
    arrSum := 0
    arrLen := len(nums)
    for i := 0; i < arrLen; i   {
        arrSum  = nums[i]
    }
    //let n be the total natural number: which will be provided plus 1 missing
    n := arrLen   1
    numSum := n * (n   1) / 2
    missingNumber := numSum - arrSum
    return missingNumber
}
func main() {
    nums := []int{1, 3, 4, 5}
    result := missingNumber(nums)
    fmt.Println(result)
}
 

В качестве альтернативы вы можете использовать цикл диапазона для обеспечения безопасности or _, i := range nums { ... :

 package main

import "fmt"

func missingNumber(nums []int) int {
    arrSum := 0
    arrLen := len(nums)

    for _, i := range nums {
        arrSum  = i
    }
    //let n be the total natural number; which will be provided plus 1 missing
    n := arrLen   1
    numSum := n * (n   1) / 2
    missingNumber := numSum - arrSum
    return missingNumber
}
func main() {
    nums := []int{1, 3, 4, 5}
    result := missingNumber(nums)
    fmt.Println(result)
}