NU:LOGiC Logo

【Go言語】配列とスライスの違いとは?Go言語でのデータ構造入門

【Go言語】配列とスライスの違いとは?Go言語でのデータ構造入門

Go言語において、データ構造の選択はプログラムの性能や柔軟性に大きく影響を与えます。

その中でも、配列とスライスは基本的なデータ構造であり、どちらを選ぶかは慎重に考える必要があります。

この記事では、Go言語における配列とスライスの違いを詳しく解説し、それぞれの利点と用途について解説します!

3行で要約すると

  • 配列は固定サイズでメモリ効率が高い。
  • スライスは動的なサイズ変更が可能で柔軟性が高い。
  • 配列とスライスの違いを理解し、プロジェクトの要件に合ったデータ構造を選択することが重要。

配列(Array)とは?

配列とは、同じ型の複数の要素を一つの変数に格納できるデータ構造です。たとえば、int型の数値を10個格納したい場合、配列を使うと便利です。

宣言と初期化

Go言語での配列の宣言は非常に簡単です。以下のコードで、int型の要素を5つ持つ配列を宣言できます。

var myArray [5]int

初期化も同時に行いたい場合はこのようにしてください。

myArray := [5]int{1, 2, 3, 4, 5}

配列の操作

配列の要素にアクセスするには、インデックスを使います。

firstElement := myArray[0]  // 1が格納される

要素を更新する場合も同様です。

myArray[0] = 6  // 先頭の要素が6になる

スライス(Slice)とは?

スライスも配列と同様、同じ型の複数の要素を格納できるデータ構造です。しかし、スライスはサイズが動的に変わる点が配列とは違います。

宣言と初期化

スライスの宣言はmake関数を使うか、リテラルを用いる方法があります。

mySlice := make([]int, 5)  // 長さ5のスライス

または、

mySlice := []int{1, 2, 3, 4, 5}  // リテラルでの初期化

スライスの操作

スライスの操作も配列と似ていますが、動的なサイズ変更が可能です。

要素の追加:

mySlice = append(mySlice, 6)  // 6が追加される

部分スライス:

subSlice := mySlice[1:4]  // 2, 3, 4が格納される

配列とスライスの違い

もちろんです、配列とスライスの違いをもう少し詳しく、そしてコード例を交えて説明します。

配列:固定サイズとメモリ

配列の宣言とサイズ

配列の一番の特徴はサイズが固定であることです。配列を宣言した際に、そのサイズは変更できません。

var myArray [3]int = [3]int{1, 2, 3}
// myArrayのサイズは3であり、これは変更できない

メモリ効率

配列はサイズが固定されているため、メモリ効率が良い場合があります。すべての要素は連続したメモリ上に格納されるため、高速な操作が可能です。

var myArray [5]int
// この配列はメモリ上で5つの連続したint型のスペースを確保します。

スライス:動的サイズと柔軟性

スライスの動的サイズ

スライスは動的にサイズを変更できます。append()関数を用いて、新しい要素を追加できます。

mySlice := []int{1, 2, 3}
mySlice = append(mySlice, 4)
// mySliceは[1, 2, 3, 4]となる

キャパシティ

スライスは内部的には配列を使ってデータを管理しますが、そのサイズ(キャパシティ)は動的に変更できます。

mySlice := make([]int, 3, 5)  // キャパシティが5のスライス
fmt.Println(cap(mySlice))  // 出力は5

スライスから部分スライスを生成

スライスから別のスライス(部分スライス)を生成することが可能です。

mySlice := []int{1, 2, 3, 4, 5}
subSlice := mySlice[1:4]  // [2, 3, 4]

配列とスライスの根本的な違い

メモリの動き

配列は固定長なので、メモリ上のサイズも固定です。一方で、スライスは動的にメモリを確保します。

パフォーマンスと柔軟性

配列は、必要なメモリを一度に確保するため、ランダムアクセスが高速です。スライスは柔軟性が高い反面、新しい要素を追加するたびにメモリを再確保する可能性があります。

関数とメソッド

配列には基本的な操作しか提供されていませんが、スライスにはappendcopyといった多くの便利な関数が用意されています。

// 配列
var arr [3]int
// arr.append(4)  // これはエラーです。配列にはappendメソッドはありません。

// スライス
sli := []int{1, 2, 3}
sli = append(sli, 4)  // これは有効です。

まとめ

配列は固定サイズと高速性がメリットですが、柔軟性には欠けます。一方で、スライスはサイズが動的で多くの組み込み関数が用意されていますが、メモリ効率が少し低くなる可能性があります。

いかがでしたか?配列とスライスの違いについて、これで明確に理解できたでしょうか。どちらを使うべきかは、その用途と必要な性能によります。この知識を持って、より効率的なコードを書いていきましょう!

どちらを使うべきか?

  • サイズが固定で、メモリ効率が重要な場合は配列。
  • サイズが動的、または機能が豊富なものが必要な場合はスライス。

まとめ

Go言語での配列とスライスは似ているものの、用途や機能に応じて使い分けが必要です。配列はシンプルで高速、スライスは柔軟性が高いです。この記事を参考に、自分のプロジェクトに最適なデータ構造を選んでください。