ホームページ >バックエンド開発 >Golang >Go スライスでスライス境界範囲外エラーが発生するのはなぜですか?

Go スライスでスライス境界範囲外エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-29 12:46:10148ブラウズ

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

スライス: 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 のスライスを管理するルールを詳しく調べる必要があります。

スライス ルール

スライスまたは配列をスライスする場合、指定されたインデックスは明示的または暗黙的のいずれかになります。インデックスが明示的に指定されていない場合、デフォルトで特定の値が設定されます。スライスの場合:

  • 欠落している下限のデフォルトは 0 です。
  • 欠落している上限のデフォルトは len(slice) (cap(slice) ではありません)。

指定されたコードでは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。