スライス: Go の範囲外エラー
Go では、スライスには既存のスライスの一部を抽出して新しいスライスを作成することが含まれますスライス。スライス中に境界外エラーが発生した場合、指定された範囲がソース スライスの有効なインデックス境界を超えていることを示します。
次のコード スニペットを考えてみましょう。
package main</p> <p>import "fmt"</p> <p>func main() {</p> <pre class="brush:php;toolbar:false">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)
}
このコードを実行すると範囲外になりますerror:
a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] panic: runtime error: slice bounds out of range goroutine 1 [running]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 +0x150
このエラーが発生する理由を理解するには、Go のスライスを管理するルールを詳しく調べる必要があります。
スライス ルール
スライスまたは配列をスライスする場合、指定されたインデックスは明示的または暗黙的のいずれかになります。インデックスが明示的に指定されていない場合、デフォルトで特定の値が設定されます。スライスの場合:
指定されたコードでは、c スライスを作成するためのスライス式が原因でエラーが発生します。 is:
c := b[1:]
これは、下限 (1) は明示的に指定されていますが、上限は明示的に指定されていないことを意味します。したがって、デフォルトは len(b) であり、0 です。ただし、指定された下限 (1) は上限 (0) よりも小さいか等しい でなければなりません。この条件が満たされないため、範囲外エラーが発生します。
このエラーを回避するには、下限と上限の両方を明示的に指定できます。たとえば、b スライスから 2 番目の要素のみを抽出するには、次のように記述します。
c := b[1:2] // c len=1 cap=4 [0]
また、2 番目の要素から開始して b スライス全体を抽出する場合は、次のように使用できます。
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
以上がGo スライスでスライス境界範囲外エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。