0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Goのスライスを直感的に理解した

Last updated at Posted at 2023-10-21

はじめに

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]がつくられます。

IMG_0094.PNG

なのでスライスを直感的に数え順で理解しようとすると右側で含ませて左で削るというとわかりやすいかと思います。同様に、s[:2]の時は、直前にできた[10 13 15]を元にすると、
右側の「含む」部分にあたるので、[10 13] がつくられます。

IMG_0095.PNG

最後のs[1:]についても同様に考えたら、これは左側の「削る」部分にあたるので、
1を削って、[13] がつくられます。

最後に

以上がスライスを直感的に扱う方法でした。
インデックス番号を交えて考えると、「どこからどこまでをスライスするんだっけ??」と一瞬頭の中がこんがらがるので、あえて数え順で直感的に考えてみる方法をお伝えしました。
ただし、Goについては学習中ということもあり、この考えで不都合が起こる可能性がある場合はご指摘いただけたら幸いです!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?