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

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

Mary-Kate Olsen
リリース: 2024-11-29 12:46:10
オリジナル
147 人が閲覧しました

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート