スキップしてメイン コンテンツに移動

Goで学ぶ配列とスライス

Goで学ぶ配列とスライス

Go初心者のための配列とスライス入門

Go言語を学び始めると、まず出会うのが配列とスライスです。配列は固定長で、宣言時にサイズを決める必要があります。一方、スライスは動的配列として扱えるため、可変長のデータを扱う際に便利です。Go初心者はまず「配列とスライス」の基本的な違いを理解し、どちらを使うべきかを判断できるようになることが重要です。

配列の宣言例:

var a [5]int // 要素数5のint配列

スライスの宣言例:

var s []int // 要素数0のintスライス

スライスは内部的に配列を参照しているため、配列の一部を切り取ることもできます。

arrayとsliceの違いと使い分け

配列はサイズが固定であるため、メモリ確保が確定しています。スライスは可変長で、必要に応じて容量(cap)が拡張されます。配列は値型であり、コピーすると全要素がコピーされますが、スライスは参照型であり、コピーしても同じ配列を参照します。

配列の例:

var arr [3]string = [3]string{"a", "b", "c"}
fmt.Println(arr[1]) // b

スライスの例:

slice := []int{1, 2, 3}
slice = append(slice, 4) // スライスに要素を追加
fmt.Println(len(slice), cap(slice)) // 4 4

スライスは「make」関数で初期化することが一般的です。例えば:

nums := make([]int, 3, 5) // len=3, cap=5
fmt.Println(nums) // [0 0 0]

make, append, len, capの基本操作

makeはスライス、マップ、チャネルを作成するための組み込み関数です。スライスの場合、make([]T, len, cap)で長さと容量を指定できます。appendはスライスに要素を追加し、必要に応じて容量を自動で拡張します。lenはスライスの現在の長さを返し、capは容量(内部配列のサイズ)を返します。

実際のコード例:

var s []int
s = append(s, 10) // s = [10]
s = append(s, 20, 30) // s = [10 20 30]
fmt.Println(len(s), cap(s)) // 3 4

容量が不足すると、Goランタイムは新しい配列を確保し、既存の要素をコピーします。これにより、スライスは「動的配列」として機能します。

スライス操作と動的配列の実践例

スライスを使った典型的な操作には、要素の追加・削除・切り取りがあります。削除はスライスの切り出しとappendを組み合わせて行います。

// 3番目の要素を削除
s := []int{1, 2, 3, 4, 5}
s = append(s[:2], s[3:]...)
fmt.Println(s) // [1 2 4 5]

また、スライスをコピーして別の配列に渡す場合は、copy関数を使用します。

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src)
fmt.Println(dst) // [1 2 3]

これらの操作を組み合わせることで、Go初心者でも柔軟にデータ構造を扱えるようになります。配列とスライスの違いを理解し、make, append, len, capを駆使して「動的配列」を実装してみましょう。

この記事はAIによって作成されました。

コメント