Go言語の多次元スライスの作り方と活用例
生徒
「先生、多次元スライスって何ですか?どうやって作るんでしょう?」
先生
「多次元スライスとは、簡単に言うと、スライスの中にスライスが入っているものです。イメージとしては、表のように行と列があるデータの管理に便利ですよ。」
生徒
「なるほど!表のようなものを作りたいときに使うんですね。具体的にはどうやって作るんですか?」
先生
「では、基本の作り方と使い方を一緒に見ていきましょう!」
1. 多次元スライスとは?
プログラミングで「多次元」とは、複数の方向を持ったデータ構造のことです。例えば、二次元は「縦」と「横」の2つの方向があり、表やマトリックスのようなイメージです。
Go言語のスライスは「動的にサイズが変わる配列」のようなものですが、多次元スライスは「スライスの中に別のスライスを入れた構造」です。
つまり、スライスのスライスとも呼ばれます。
2. 多次元スライスの基本的な作り方
まずは、二次元スライスの宣言(せんげん)と初期化(しょきか)を見てみましょう。
var matrix [][]int
これは「整数を入れる二次元スライス」を宣言しただけの状態です。まだ中身は空っぽです。
次に、実際に中に値を入れてみましょう。
matrix = [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
このように書くと、3行3列の表のような形で値が入ります。
3. 多次元スライスの具体的な使い方
多次元スライスは、例えばゲームのマップや、表計算、画像のピクセル情報など、行と列のあるデータを扱うときに便利です。
以下の例では、二次元スライスを使って数値を出力する方法を示します。
package main
import "fmt"
func main() {
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
for i, row := range matrix {
for j, val := range row {
fmt.Printf("matrix[%d][%d] = %d\n", i, j, val)
}
}
}
このコードは、二重のループ(ループの中にループ)を使って、それぞれの行と列の値を取り出して表示しています。
4. 多次元スライスの初期化の注意点
多次元スライスは、行ごとに長さを変えられるという特徴があります。つまり、下の例のように行の長さがバラバラでも問題ありません。
matrix := [][]int{
{1, 2},
{3, 4, 5},
{6},
}
これは「ジャグ配列」と呼ばれ、行ごとに列数が異なります。場合によってはこちらの方が使いやすいこともあります。
5. 動的に多次元スライスを作成する方法
多次元スライスはプログラムの実行中に動的に作ることもできます。例えば、行数だけ決めて、その後で各行の列数を決める方法です。
rows, cols := 3, 4
matrix := make([][]int, rows)
for i := 0; i < rows; i++ {
matrix[i] = make([]int, cols)
}
このコードは、3行4列の空の多次元スライスを作っています。後で値を代入できます。
6. 実際に値を代入してみよう
上で作った空の多次元スライスに値を入れてみましょう。
for i := 0; i < rows; i++ {
for j := 0; j < cols; j++ {
matrix[i][j] = i*cols + j + 1
}
}
このループは、左上から右下に向けて順に数字を入れる例です。
7. 多次元スライスの活用例:簡単な表の管理
多次元スライスは、例えば学校の成績表のようなデータを管理するのに便利です。行に学生、列に科目の点数を入れられます。
scores := [][]int{
{80, 90, 85}, // 学生Aの点数
{70, 75, 80}, // 学生Bの点数
{90, 95, 100}, // 学生Cの点数
}
このように多次元スライスを使うことで、行と列でデータをわかりやすく管理できます。
8. 多次元スライスを使うときのポイント
- スライスのスライスなので、行ごとに長さを変えられる。
- 初期化のときに中身を直接書くか、make関数で動的に作る方法がある。
- アクセスするときは、
matrix[行番号][列番号]のように指定する。 - ループ処理を使うと、簡単に全データを扱える。