首頁 >後端開發 >Golang >Go 切片時如何避免「切片邊界超出範圍」錯誤?

Go 切片時如何避免「切片邊界超出範圍」錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-04 00:21:09380瀏覽

How to Avoid

Go 中的切片:了解越界錯誤

在 Go 中切片時,必須遵守特定的邊界以避免錯誤。此類錯誤之一是“切片超出範圍”錯誤。當切片表達式導致索引超出允許範圍時,就會發生此錯誤。

在提供的程式碼片段中:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[1:]
    printSlice("c", c)
}


func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}

嘗試使用下列指令建立 c 切片時會發生錯誤表達式 c := b[1:]。這個錯誤不是由下限(可以等於或大於長度)引起的,而是由上界引起的。

在 Go 中,切片的預設上限是切片操作數的長度。但是,在本例中,切片操作數 b 的長度為 0。因此,預設上限變為 0。因此,表達式c := b[1:] 導致下限為1,上限為0 .

這違反了切片規則,該規則規定對於切片,索引必須滿足以下條件條件:

0 <= low <= high <= cap(a)

其中:

  • low 是下界
  • high是上界
  • cap(a) 是切片運算元的容量

在這種情況下,由於1 不小於或等於為0 時,表達式會導致越界錯誤。

要解決此問題,必須在切片時指定明確邊界。例如:

c := b[1:1]        // Slice from index 1 to 1 (empty slice)
c := b[1:2]        // Slice from index 1 to 2 (contains the element at index 1)
c := b[1:cap(b)]   // Slice from index 1 to the capacity of the operand (contains all elements)

以上是Go 切片時如何避免「切片邊界超出範圍」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn