當數組長度不為空時出現「恐慌:運行時錯誤:索引超出範圍」
理解數組長度和容量
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中文網其他相關文章!