ホームページ >バックエンド開発 >Golang >Go で `b[1:]` をスライスすると範囲外エラーが発生するのはなぜですか?

Go で `b[1:]` をスライスすると範囲外エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 03:43:14764ブラウズ

Why Does Slicing `b[1:]` Cause an Out-of-Bounds Error in 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 スライスの作成時に無効なスライス式が原因で発生します。

Go では、配列またはスライスのスライスは次の規則に従います。

  • 0 < の場合、インデックスは範囲内にあります。 = low <= high <= 配列または文字列の場合は len(a)。
  • スライスの場合は、上位インデックス境界のデフォルトは、長さではなくスライス容量 (cap(a)) になります。

スライス式 b[1:] は、下限 1 で新しいスライス c を作成しようとします。ただし、上限は欠落しており、デフォルトでは b の長さ (0) になります。これにより、下限が上限よりも大きいスライスが作成され、「範囲外」が発生します。 error.

このエラーを修正するには、スライス式の上限が下限以上であることを確認する必要があります。たとえば、次の式を使用して有効なスライス c を作成できます。

c := b[1:2]

これにより、下限が 1、上限が 2 のスライス c が作成されます。これは、1 < であるため有効です。 = 2

以上がGo で `b[1:]` をスライスすると範囲外エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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