Go言語のスライスと配列の使い分け!それぞれのメリット・デメリット
生徒
「先生、Go言語にはスライスと配列という似たものがありますけど、どう違うんですか?どちらを使えばいいか迷います。」
先生
「いい質問です。スライスと配列は似ていますが、使い方や特徴が違います。簡単にいうと、配列はサイズが固定された箱で、スライスはその箱を柔軟に使える便利な道具です。」
生徒
「サイズが固定の箱と柔軟な道具って、具体的にどういうことですか?」
先生
「それでは、それぞれの特徴やメリット・デメリットを詳しく説明しますね!」
1. 配列とは?サイズが決まった固定の箱
配列は、あらかじめ決まったサイズの箱に物を入れるイメージです。たとえば、10個分の仕切りがあるお弁当箱のようなもので、サイズを変えられません。
Go言語の配列は、宣言時にサイズを決めて、そのサイズのまま使います。例えば、5つの整数を入れる配列は次のように書きます。
var numbers [5]int
この配列は必ず5つの整数を持ちます。サイズ変更はできません。
2. スライスとは?サイズが変えられる柔軟な道具
スライスは配列の一部を切り取ったり、サイズを動的に変えたりできる便利な機能です。お弁当箱の例でいうと、仕切りが伸び縮みする弁当箱のようなものです。
Go言語でスライスを作るときは、次のように書きます。
fruits := []string{"りんご", "バナナ", "みかん"}
このスライスは3つの要素を持ちますが、あとから要素を追加したり減らしたりできます。
3. 配列のメリット・デメリット
- メリット:サイズが固定なので、メモリの管理が明確で高速に動くことが多いです。
- デメリット:サイズが固定なので、要素数が変わるデータには不向きです。また、サイズ変更のために新たな配列を作り直す必要があります。
配列は例えば、固定の大きさの机の引き出しにものを入れるようなイメージです。引き出しの大きさは変えられません。
4. スライスのメリット・デメリット
- メリット:サイズが動的に変えられるため、要素数が変わるデータに便利です。使いやすくてGo言語で最もよく使われます。
- デメリット:内部で配列を使っているため、メモリ確保やコピーが発生することがあり、場合によってはパフォーマンスに影響が出ることがあります。
スライスは、伸縮自在の引き出しのように考えると分かりやすいでしょう。必要に応じて大きくしたり小さくしたりできます。
5. 使い分けのポイント
初心者がGo言語でプログラミングを始めるときは、
- データの数が固定なら配列
- データの数が変わる可能性があるならスライス
を意識するとよいでしょう。
実際にはスライスが圧倒的に使いやすくて多用されているので、ほとんどの場面でスライスを使うことになります。
6. 配列とスライスのコード例
配列とスライスの違いをコードで見てみましょう。
// 配列(サイズ固定)
var arr [3]int = [3]int{10, 20, 30}
fmt.Println("配列:", arr)
// スライス(サイズ可変)
slice := []int{10, 20, 30}
fmt.Println("スライス:", slice)
slice = append(slice, 40) // 要素を追加
fmt.Println("追加後のスライス:", slice)
配列は要素数3で固定ですが、スライスはappendで要素を簡単に追加できます。
7. スライスの内部は配列
実はスライスは内部で配列を参照しているだけです。スライス自体は配列の「一部」を指すような仕組みです。
このため、スライスを使うときは配列のサイズ制限を気にせずにデータを扱えます。
8. 配列を使う場面は限定的
Go言語では配列を使う場面はあまり多くありません。たとえば、決まったサイズのデータを扱う特別な処理や、性能を極限まで追求したい場合です。
それ以外はスライスを使うことをおすすめします。