What causes panic: runtime error: index out of range [4] with length 4 even though array is initialized as dynamic array
What causes panic: runtime error: index out of range [4] with length 4 even though array is initialized as dynamic array
我已经初始化了一个动态数组,但它显示索引超出范围。
我也试过给定长度,但它也显示同样的错误。
错误描述:
恐慌:运行时错误:索引超出范围 [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)
}
这是您程序中的更正,用于从自然数序列中找到一个缺失的数字。您正在索引数组 nums[len(nums) + 1] 超出数组的范围。如果允许,这应该访问随机内存并读取任何合法的垃圾值,您甚至不会知道如此难以发现的错误。好处是 Go 会检查你是否只访问数组中存在的元素,而不是超出数组的元素。 Read this in Go specs
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)
}
您应该将 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)
}
我已经初始化了一个动态数组,但它显示索引超出范围。 我也试过给定长度,但它也显示同样的错误。 错误描述: 恐慌:运行时错误:索引超出范围 [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)
}
这是您程序中的更正,用于从自然数序列中找到一个缺失的数字。您正在索引数组 nums[len(nums) + 1] 超出数组的范围。如果允许,这应该访问随机内存并读取任何合法的垃圾值,您甚至不会知道如此难以发现的错误。好处是 Go 会检查你是否只访问数组中存在的元素,而不是超出数组的元素。 Read this in Go specs
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)
}
您应该将 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)
}