MENU

【3分で理解する】golangのスライスのmakeとcapについて 使い方、注意点について解説

本ページではアフィリエイトリンク(PR)が含まれています

前回、golangのスライスについて解説しました。

あわせて読みたい
【3分で理解する】golangのスライスとは 使い方、注意点について解説 今回はgolangにおけるスライスについて解説していきます。 【スライスとは】 golangにはSlice(スライス)というデータ構造があり、他の言語でいう配列と似ていますが、微...

今回はそのスライスの中で用いられる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の学習におすすめのUdemy教材5選 これから業務でgolangを使うことになった方、これからgolangを使ってキャリアを歩んでいきたいという方でどのように学習していこうか悩んでいる方もいるかと思います。 ...

golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。

あわせて読みたい
【入門】golangの学習におすすめの本/書籍7選 これから業務でgolangを使うことになった方、これからgolangを使ってキャリアを歩んでいきたいという方でどのように学習していこうか悩んでいる方もいるかと思います。 ...
タメになったらシェアお願いします!
  • URLをコピーしました!
  • URLをコピーしました!
目次