Go言語のスライスの基本!配列との違い・使い方を理解しよう
生徒
「Go言語で配列とよく一緒に出てくる“スライス”って何ですか?違いは何でしょう?」
先生
「スライスは配列の便利で柔軟なバージョンだと考えてください。配列はサイズが決まっていて変えられませんが、スライスは必要に応じてサイズを変えられます。」
生徒
「サイズが変えられるってどういうこと?具体的にはどう使うんですか?」
先生
「それでは、スライスの定義から使い方まで、順番にわかりやすく説明していきますね!」
1. スライスとは?配列との違い
スライス(slice)は、配列の一部や全部を柔軟に扱うためのデータ構造です。配列はサイズが決まっていて、例えば5個だけデータを持つ配列は、ずっと5個のままです。
一方スライスは、必要な分だけのデータを扱えて、あとからサイズを増やしたり減らしたりできる「伸び縮みする箱」のようなものです。
イメージで言うと、配列は「固定サイズの引き出し」、スライスは「必要に応じて大きさを変えられる引き出し」です。
2. スライスの定義と初期化
スライスは次のように定義します:
var s []int
これは「整数のスライスsを作る」という意味で、まだデータは入っていません。
スライスを初期化して、値を入れるときは:
s := []int{10, 20, 30}
これで3つの整数を持つスライスが作れます。
また、make関数を使って空のスライスを作ることもできます:
s := make([]int, 3) // 長さ3のスライスを作成(初期値は0)
make関数は「空の箱を作る」イメージで、ここでは3個分の箱ができます。
3. スライスの要素にアクセスする
スライスも配列と同じように添字(インデックス)でアクセスします。添字は0から始まります。
fmt.Println(s[0]) // 10
s[1] = 50 // 2番目の値を50に変更
fmt.Println(s[1]) // 50
範囲外の添字を使うとエラーになるので注意しましょう。
4. スライスの長さと容量
len(s)でスライスの長さ(要素数)がわかります。
fmt.Println(len(s)) // 3
さらにcap(s)はスライスの容量を示し、今割り当てられている最大要素数を表します。
容量はスライスのサイズを増やすときの目安になる数です。
5. append関数で要素を追加する
スライスの一番大きな特徴は、append関数で簡単に要素を追加できることです。
s = append(s, 40) // 40を追加
fmt.Println(s) // [10 50 30 40]
追加したい要素をappendの引数に書くだけで、スライスが自動で拡張されます。
6. スライスの部分取り出し(スライスリテラル)
スライスは配列や他のスライスの一部を取り出すことができます。これを「スライス操作」と言います。
a := []int{1, 2, 3, 4, 5}
b := a[1:4] // 2番目から4番目の要素を取り出す
fmt.Println(b) // [2 3 4]
添字の書き方は[開始位置:終了位置]で、開始位置は含み、終了位置は含みません。
7. 配列とスライスの違い
- 配列はサイズが決まっていて変更できない
- スライスは動的にサイズが変えられる
- スライスは配列の一部を扱うこともできる
- ほとんどのGoプログラムではスライスがよく使われる
スライスを覚えるとGo言語でのデータ管理がとても楽になります。
8. スライスのコピーと参照
スライスは配列とは違い、中のデータへの参照(ポインタ)を持っています。
そのため、別の変数に代入しても、元のスライスと同じデータを指しています。
a := []int{1, 2, 3}
b := a
b[0] = 100
fmt.Println(a) // [100 2 3]
この特徴は便利ですが、意図しない影響を避けるために気をつけましょう。
9. スライスを使うシーン
スライスはサイズが変わるデータを扱いたいときに便利です。例えば、ユーザーからの入力リストやファイルの行データを扱うときに使われます。
Go言語でプログラムを書くなら、配列よりもスライスのほうがよく使われますので、しっかり理解しておきましょう。
まとめ
Go言語のスライスは、配列より柔軟にデータを扱える非常に便利な仕組みであり、多くのプログラムで中心的に使われます。配列との大きな違いは「サイズが変えられる」という点であり、この特徴だけでもスライスを使う価値があります。さらに、スライスは背後で配列を参照しているため、データ構造の動き方を理解すれば、どのような場面で最適に使えるかが見えてきます。今回の記事で、定義の仕方・初期化・要素追加・部分取り出し・容量や長さの概念など、スライスを活用するために必要な重要ポイントを順番に学ぶことができました。とくに append 関数を用いてスライスを拡張できる機能は、Go言語ならではの強力な仕組みで、多くの実用的な場面で役立ちます。
また、スライスには参照としての性質があり、別の変数に代入すると同じデータを共有するという重要な特徴があります。この性質を理解しておくことで、意図しない変更が起きたときに何が原因なのかをすぐに把握でき、より安全で整ったコードを書くことができます。とくに複雑なデータ構造を扱うときや、大量のデータを処理するときには、この動作が性能面にも影響するため、スライスの内部構造を意識することが大切です。
スライスは柔軟で扱いやすい反面、配列と違い容量と長さが異なることがあるため、そこを理解して使いこなすことで、Go言語でのデータ処理がより直感的でスムーズになっていきます。以下に総まとめとして、スライスの特徴を踏まえた簡単なサンプルコードを紹介します。スライスの基本動作を復習しつつ、実際にどのように使われるのかをイメージしてみてください。
スライスの総まとめサンプルコード
package main
import "fmt"
func main() {
nums := []int{1, 2, 3}
fmt.Println("初期スライス:", nums)
nums = append(nums, 4, 5)
fmt.Println("append後:", nums)
part := nums[1:4]
fmt.Println("部分スライス:", part)
fmt.Println("長さ:", len(nums))
fmt.Println("容量:", cap(nums))
}
このコードでは、スライスの作成・要素の追加・部分取り出し・長さと容量の確認といった基本要素をひととおり体験できます。スライスは Go プログラム全般で活躍するため、しっかり基礎を固めて活用できるようにしておきましょう。慣れてくると、配列よりもはるかに扱いやすく、より自然に使いこなせるようになります。
生徒
「先生、最初は配列とスライスの違いがよくわからなかったんですが、使ってみるとスライスって本当に便利ですね!」
先生
「そうでしょう。特に append や部分取り出しの仕組みを知ると、スライスが柔軟に使える理由がよく分かりますよね。」
生徒
「はい!容量と長さが違う理由も理解できました。参照としてデータを共有しているっていう仕組みも納得です。」
先生
「その調子です。スライスは Go 言語で最もよく使うデータ構造なので、しっかり使いこなせるようになるといろいろなプログラムが書けるようになりますよ。」
生徒
「これからもっと練習して、スライスを自然に使えるようになりたいです!」