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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-08 15:30:10260ブラウズ

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

Go スライス要素のインデックス作成: s[lo:hi] が要素 hi-1 で終了する理由

Go スライスでは、式 s [lo:hi] は、位置 lo から位置 hi-1 までの要素のスライスとして評価されます。これには要素 hi が含まれることが予想されるため、これは直観に反するように思えるかもしれません。ただし、この決定の背後にはいくつかの設計上の根拠があります。

このアプローチの利点の 1 つは、ポインター演算にあります。 C などの言語では、配列はその最初の要素へのポインターとして表されます。 0 から始まるインデックスの配列と包含/排他的スライスを使用すると、要素 i のアドレスは単に配列ポインターに i を加えたものになるため、要素アドレスの計算が簡素化されます。

第 2 に、このインデックス付けスキームにより、次のように指定することで元のスライスを抽出できます。 arr[0:len(arr)]。これは、データをスライスに読み取り、追加の操作を行わずに空でないスライスを抽出するなどのシナリオで役立ちます。

最後に、インデックスの重複を防ぎます。これは、配列を連続したインデックスを持つサブスライスに分割すると、スライスが配列全体を完全にカバーすることを意味します。これにより、以下のコード スニペットに示すように、連続しない整数に基づいて配列を分割するなどの操作が容易になります。

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
}

s[lo:hi] に要素 hi を含めたほうが直感的ではないでしょうか?はい、おそらく初心者向けです。ただし、簡素化されたポインター演算、シームレスなスライス抽出、重複しないインデックスなど、0 インデックスの配列と包含-排他的スライスの利点は、直感的な包含-包含スライシングの利点を上回ります。

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

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