首頁  >  文章  >  後端開發  >  當 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:52503瀏覽

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