ホームページ > バックエンド開発 > Golang > Go の `s[lo:hi]` スライスがインデックス `hi` の要素を除外するのはなぜですか?

Go の `s[lo:hi]` スライスがインデックス `hi` の要素を除外するのはなぜですか?

DDD
リリース: 2024-12-09 19:36:21
オリジナル
195 人が閲覧しました

Why Does Go's `s[lo:hi]` Slice Exclude the Element at Index `hi`?

なぜ Go スライス s[lo:hi] は要素 hi-1 で終了するのですか?

Go スライス式 s[lo:hi] は要素を含むスライスを作成しますインデックス lo からインデックス hi-1 まで。この動作は、いくつかの設計原則によって説明されます。

ポインター演算

Go では、スライスは基になる配列へのポインターとして実装されます。 0 から始まるインデックスの配列と包含/排他的スライスを使用すると、簡単なポインター演算が可能になります。スライス内のインデックス i の要素は、スライスのポインタが指す要素に i を加えたものです。

スライスの長さ

Go スライスの長さは、スライスする位置でもありますそれ。これは、arr[0:len(arr)] が arr 自体を返すことを意味します。このプロパティは、読み取りまたは書き込み操作の後にスライスからデータを抽出する場合に便利です。

重複しないインデックス

包含/排他的スライスにより、配列の連続したサブスライスが重複しないことが保証されます。たとえば、arr = [1, 2, 3, 4] の場合、arr[0:2] = [1, 2]、arr[2:4] = [3, 4]、および arr[0:4] = 編このプロパティは、サブスライスの分割または操作を必要とする操作を簡素化します。

次の Go コードを考えてみましょう。

func consecutiveSlices(ints []int) [][]int {
    ret := make([][]int, 0)
    i, j := 0, 1
    for j < len(ints) {
        if ints[j] != ints[j-1] + 1 {
            ret = append(ret, ints[i:j])
            i = j
        }
    }
    ret = append(ret, ints[i:j])
    return ret
}
ログイン後にコピー

この関数は、整数のスライスを次のように分割します。各要素とその前の要素との差に基づく連続したサブスライス。包含-排他的スライシング手法を使用すると、包含-包含スライシングを使用する場合と比較して、よりシンプルで効率的な実装が可能になります。

以上がGo の `s[lo:hi]` スライスがインデックス `hi` の要素を除外するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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