首页  >  文章  >  后端开发  >  即使我的 Go 切片的容量非零,为什么我会收到“恐慌:运行时错误:索引超出范围”?

即使我的 Go 切片的容量非零,为什么我会收到“恐慌:运行时错误:索引超出范围”?

Patricia Arquette
Patricia Arquette原创
2024-11-02 09:08:03571浏览

Why am I getting

当数组长度不为空时排查“恐慌:运行时错误:索引超出范围”

在 Go 中,当使用数组或对于切片,理解长度和容量的概念至关重要。在给定的代码片段中,问题源于使用 make([]string, 0, 4) 初始化结果数组。

理解 make([]string, 0, 4) 的作用

make([]string, 0, 4) 创建一个 []string 类型的切片,初始长度为 0,容量为 4。容量定义了可以存储的最大元素数量

区分长度和容量

长度表示切片中当前存在的元素数量,而容量表示它可以容纳的最大大小。如果切片已包含足够的元素,则在容量内添加更多项目不会导致重新分配。但是,超过容量将触发重新分配,这涉及创建新的底层数组并复制现有元素。

在您的代码中,make([]string, 0, 4) 使用容量初始化一个空切片4. 尝试访问超出当前长度(索引 0)的元素将导致运行时错误,因为该索引处没有元素。

解决问题

可以通过使用足够的初始长度初始化切片或使用追加根据需要动态增长切片来解决该错误。

选项 1:使用足够的长度初始化

如果您知道切片中将存储的元素的大致数量,则可以使用适当的长度对其进行初始化。例如, result := make([]string, 4) 初始化一个长度和容量为 4 的切片。

选项 2:使用 Append

Append 追加元素到切片的末尾。如果切片有足够的容量,则会对其进行重新切片以容纳新元素。如果没有,则分配一个新的底层数组。通过重复使用追加,您可以根据需要逐渐增大切片,而不必担心超出容量。

使用 Append 的简化代码

这是使用以下代码的简化版本附加:

<code class="go">package main

import (
    "fmt"
    "strings"
)

func main() {
    strs := strings.Fields("Political srt")
    var result []string
    for _, s := range strs {
        if strings.ContainsAny(s, "eaiu") {
            result = append(result, s)
        }
    }
    fmt.Println(result)
}</code>

以上是即使我的 Go 切片的容量非零,为什么我会收到“恐慌:运行时错误:索引超出范围”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn