首頁  >  文章  >  後端開發  >  即使我的 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:初始化a 足夠的長度

如果您知道切片中將儲存的元素的大致數量,您可以使用適當的長度對其進行初始化長度。例如, 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