首頁 > 後端開發 > Golang > 主體

為什麼即使數組長度不為空,我的 Go 程式碼也會拋出'恐慌:運行時錯誤:索引超出範圍”錯誤?

Barbara Streisand
發布: 2024-10-29 04:39:02
原創
602 人瀏覽過

Why does my Go code throw a

當數組長度不為空時出現「恐慌:運行時錯誤:索引超出範圍」

理解數組長度和容量

Go 中的陣列儲存固定數量的值並具有指定的長度。數組的長度決定了它所包含的元素數量。然而,Go 切片作為數組的抽象,引入了另一個概念:容量。容量表示切片可以容納的最大元素數。

使用 make([]T, len, cap) 建立切片時,其中 T 是元素類型,您需要指定長度和容量。如果容量大於長度,切片可以擴展以容納更多元素,而無需重新分配記憶體。如果容量為零,則使用長度作為容量。

解決錯誤

在提供的程式碼片段中,make 函數用於建立一個[ ]長度為0、容量為4 的字串切片:

<code class="go">result := make([]string, 0, 4)</code>
登入後複製

這意味著該切片最初可以容納0 個字串,並且可以擴展至最多容納4 個字串,而無需重新分配記憶體。

錯誤「panic:runtime error:index out of range」出現錯誤是因為存取超出切片長度的索引處的元素是無效的。在原始程式碼片段中,循環嘗試存取從 result[0] 開始的元素,但由於切片為空,因此該索引處沒有元素。

將元素添加到切片

要解決該錯誤,我們需要使用append 函數將元素附加到切片。 append 函數傳回一個包含新增元素的新切片:

<code class="go">result = append(result, "foo")</code>
登入後複製

每次追加一個元素,切片的長度都會增加,如果達到容量,則會分配一個具有更大容量的新底層陣列。在這種情況下,第一個追加將長度增加到 1,並且由於容量為 4,因此無需重新分配。

簡化程式碼範例

這裡是一個簡化範例使用append向切片添加元素而不會遇到錯誤:

<code class="go">package main

import "fmt"

func main() {
    result := make([]string, 0, 4)

    // Append elements to the slice
    result = append(result, "foo")
    result = append(result, "bar")

    // Access the elements using valid indices
    fmt.Println(result[0]) // Output: foo
    fmt.Println(result[1]) // Output: bar
}</code>
登入後複製

在這個在範例中,make函數建立了一個初始長度為0、容量為4的切片。然後,我們使用append將兩個元素添加到切片中。最後,我們可以使用有效索引來存取元素,而不會遇到“索引超出範圍”錯誤。

以上是為什麼即使數組長度不為空,我的 Go 程式碼也會拋出'恐慌:運行時錯誤:索引超出範圍”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!