2017/03/02

[golang][雰囲気]スライス (1)

お仕事で、Go言語のソースを読もうとしている。
書こうとしている、ではない。
読むだけだ。

もちろん、読み書きできるのが一番良いし、望ましいのだが、いかんせん時間が無い。
あちこち目をつぶって、雰囲気だけつかむことを目指す。


その第1弾が、スライスだ。

 

スライス型
http://golang.jp/go_spec#Slice_types

スライス
http://golang.jp/go_spec#Slices

スライスは「ある配列内の連続した領域への参照」と書いてある。
そしてスライス型は「その要素型と同じ要素型を持つ配列のすべてのスライスの集合」らしい。

なぜ配列とは別になっているのだろうか?
配列内で、連続した領域を参照しているなら、それはそれで配列なんじゃなかろうか。。。

いま思っているのは、太枠が配列だとしたら、赤い部分がその一部を参照しているうスライスだ。
スライスは要素が0から始まると書いてあるので、こうなるはず。

image

 

 

スライス型の1項目前が「配列型」だった。
http://golang.jp/go_spec#Array_types
配列も型なんだ・・・。
説明だけ読むと、配列型は要素型の要素を複数持っていて、インデックスで連番アクセスできて、長さも持っている、というだけのようだ。
他の言語と同じように見える。
まあ、C/C++の配列は要素数を持たないけどね。

 

スライスは、キャパシティ、という概念があるようだ。
ちょっと違うが、STLのsize()とcapacity()みたいな雰囲気がある。
上の図だと、capacityは5になるはず。

 

make()で新しいスライスを作ることができるらしい。
・・・ん?
makeの引数に、要素型と長さの指定、capacityまで指定はできるけど、そもそも参照型だから「誰のどこから」という情報がいるんじゃなかろうか。
「隠された配列を新たに割り当て」など、参照するという言葉の意味が分からなくなってくる。。。
新しい領域を割り当てるんだったら、それはもう配列でよいんじゃないのか??

 

まだスライス型のところを読んだだけなので、次の「スライス」を読むと謎が解決するのかもしれない。
ともかく、今回はここまで。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。