首页  >  文章  >  后端开发  >  当 Go 切片长度非空时,为什么会出现“panic:runtime error:index out of range”?

当 Go 切片长度非空时,为什么会出现“panic:runtime error:index out of range”?

Linda Hamilton
Linda Hamilton原创
2024-10-31 15:24:52501浏览

Why Does

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

提供的代码片段尝试迭代字符串以包含元音的单独单词。然而,尽管数组长度不为空,它还是遇到了“恐慌:运行时错误:索引超出范围”错误。

要理解此错误,必须深入研究底层切片数据结构。

理解切片

Go 中的切片是数组段的描述符。它由三个部分组成:指向实际数组的指针、段的长度及其容量(段可以容纳的最大长度)。

使用 make([]string, 0, 4) 创建切片时,分配一个空的底层数组,初始长度为 0,容量为 4。

区分

result := make([]string, 0, 4) 与 result := make([]string, 4) 的不同之处如下:

  • make([]string, 0, 4):初始化一个空数组,意味着访问 result [0] 会引起恐慌。
  • make([]string, 4):初始化一个包含 4 个元素的数组,允许通过 result[3] 访问 result[0]。

理解append

append 函数将元素添加到切片的末尾。如果切片有足够的容量,它会重新切片目标以容纳新元素。否则,将分配一个新的底层数组。

应用于代码

在提供的代码中,行 result := make([]string, 0, 4 ) 创建一个空切片。尝试在循环内访问 result[0] 将导致恐慌。

要纠正此问题,请使用追加来填充切片,如以下代码片段所示:

<code class="go">for i := 0; i < len(strs); i++ {
    if strings.ContainsAny(strs[i], "eaiu") {
        result = append(result, strs[i])
    }
}</code>

或者,您可以使用基于范围的循环来简化代码:

<code class="go">for _, s := range strs {
    if strings.ContainsAny(s, "eaiu") {
        result = append(result, s)
    }
}</code>

以上是当 Go 切片长度非空时,为什么会出现“panic:runtime error:index out of range”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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