前回、golangのスライスについて解説しました。
今回はそのスライスの中で用いられるmakeとcapについて解説していきます。
スライスのmakeとは
スライスを定義する際にmake()関数を使うことが出来ます。
make()関数を用いて次のような形でスライスを定義します。
a := make([]int, 3, 5)
make()関数への引数は[]データ型, 長さ, キャパシティの順となっています。キャパシティは任意ですが、省略した場合は長さと同じ値が入ります。
スライスのcapとは
スライスにはキャパシティ (capacity)というものがあり、これはスライスに割り当てらているバッファのサイズのことを指します。
cap()関数をキャパシティを取得することができます。
a := make([]int, 3, 5)
fmt.Printf("len=%d cap=%d value=%v", len(a), cap(a), a)
このPrintfの結果はlen=3 cap=5 value=[0 0 0]
aは長さが3、キャパシティが5、要素が[0 0 0]のスライスということが分かります。
さらにappend()関数を使って要素を追加してみます。
a := make([]int, 3, 5)
a = append(a, 0, 0)
fmt.Printf("len=%d cap=%d value=%v", len(a), cap(a), a)
こちらの結果はlen=5 cap=5 value=[0 0 0 0 0]
aは長さが5、キャパシティが5、要素が[0 0 0 0 0]というスライスに変更されていることが分かります。
メモリを気にする開発を行う場合はキャパシティを指定してスライスを定義する必要がありますが、それ以外はさほど重要ではありません。
キャパシティは省略できる
make()関数の説明でも少し触れましたが、キャパシティは省略してmake()を実行することができます。
a := make([]int, 3)
fmt.Printf("len=%d cap=%d value=%v", len(a), cap(a), a)
結果はlen=3 cap=3 value=[0 0 0]
キャパシティは省略してmake()を行うと、長さと同じ値がキャパシティにも入ります。
0のスライスかnilか
スライスの宣言はmake()を使わなくても行えるのはご存じかと思います。
では以下の二つのPrintf()の結果はどうなるでしょうか。
a := make([]int, 0)
var b []int
fmt.Printf("len=%d cap=%d value=%v", len(a), cap(a), a)
fmt.Printf("len=%d cap=%d value=%v", len(b), cap(b), b)
答えはどちらもlen=0 cap=0 value=[]と同じものが出力されます。
出力内容は同じですが、これらには微妙に違いがあります。
スライスaはmake()を使っているため長さ0、キャパシティ0のスライスをメモリに確保します。逆にbはnilのためメモリ確保は行いません。
メモリを気にする開発以外では重要ではありませんが、このような違いが発生することも覚えておくといいかもしれません。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。