「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go スライスでスライス境界範囲外エラーが発生するのはなぜですか?

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

2024 年 12 月 21 日に公開
ブラウズ:902

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

スライス: Go の範囲外エラー

Go では、スライスでは既存のスライスの一部を抽出して新しいスライスを作成します。スライス。スライス中に境界外エラーが発生した場合、指定された範囲がソース スライスの有効なインデックス境界を超えていることを示します。

次のコード スニペットを検討してください:

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)

}

このコードを実行すると範囲外エラーが発生します:

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]
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3