はじめに
Go言語の基礎文法を勉強していますが、スライスの処理の仕方がイマイチわかりませんでした。解説を見ても配列のインデックスを気にしながら指を折って数える始末・・・。
しかし、直感的に考えるコツを見つけたのでシェアします。
以下はA Tour of Go
のスライスの解説。
コロンで区切られた二つのインデックス low と high の境界を指定することによってスライスが形成されます。
これは最初の要素は含むが、最後の要素は除いた半開区間を選択します。
a[low : high]
実践
では実際にどのようなスライスの挙動が展開されるかというと以下の具合です。
package main
import "fmt"
func main() {
s := []int{9, 10, 13, 15, 20}
s = s[1:4]
fmt.Printf("%v\n", s) //[10 13 15]
s = s[:2]
fmt.Printf("%v\n", s) //[10 13]
s = s[1:]
fmt.Printf("%v\n", s) //[13]
}
%v は、さまざまなデータ型の値を文字列として表示するための汎用的なフォーマット指定子です。(ChatGPT3.5)
「最初の要素は含むが、最後の要素は除いた半開区間を選択します」
なのでs[1:4]
の場合は、10
がインデックス番号が1番目であり、
4のインデックス番号、つまり、20
以降を除く、ということなので[10 13 15]
になると思います。
このときに感じるのが、スライスということでもっと直感的に扱いたいが、インデックスが絡んでくるとややこしくなることがネックだと感じました。
もっと直感的に考えると
そこで以下のスケッチの通り対処すると簡単に扱えることがわかりました。
どういうことかというと、インデックスで考えるより、要素の数え順で見た方がより直感的に扱えるということです。
たとえば、
s := []int{9, 10, 13, 15, 20}
s = s[1:4]
このときに、まずは4
に着目すると、インデックス番号ではない、並び順でまずは4つ目を含ませる(黄色)ようにします。
そして、左の1
の通りひとつめを削るイメージになります(赤色)。
結果的に[10 13 15]
がつくられます。
なのでスライスを直感的に数え順で理解しようとすると右側で含ませて左で削る
というとわかりやすいかと思います。同様に、s[:2]
の時は、直前にできた[10 13 15]
を元にすると、
右側
の「含む」部分にあたるので、[10 13]
がつくられます。
最後のs[1:]
についても同様に考えたら、これは左側
の「削る」部分にあたるので、
1
を削って、[13]
がつくられます。
最後に
以上がスライスを直感的に扱う方法でした。
インデックス番号を交えて考えると、「どこからどこまでをスライスするんだっけ??」と一瞬頭の中がこんがらがるので、あえて数え順で直感的に考えてみる方法をお伝えしました。
ただし、Goについては学習中ということもあり、この考えで不都合が起こる可能性がある場合はご指摘いただけたら幸いです!