メインコンテンツまでスキップ

Goの配列とスライスを理解しよう

Go言語では、配列とスライスを使用して複数の値を格納および操作できます。 配列は固定長のデータ構造であり、スライスは可変長のデータ構造です。 ここでは、Goの配列とスライスの基本的な使い方を説明します。

配列の宣言と初期化

package main

import (
"fmt"
)

func main() {
// 配列の宣言と初期化
// Goの配列は長さ変更できないため、サイズを指定する必要があります
var scores [3]int

scores[0] = 10
scores[1] = 20
scores[2] = 30

fmt.Println(scores[0])
fmt.Println(scores[1])
fmt.Println(scores[2])
}

リテラルliteralを使用して配列の初期値をまとめて初期化することもできます。

package main

import (
"fmt"
)

func main() {
// 配列の宣言と初期化(リテラルを使用)
scores := [3]int{10, 20, 30}

fmt.Println(scores[0])
fmt.Println(scores[1])
fmt.Println(scores[2])
}

長さ自動推論

Goでは、...で配列の長さを自動的に推論させることもできます。

package main
import (
"fmt"
)
func main() {
// 配列の長さを自動推論
scores := [...]int{10, 20, 30}

fmt.Println(scores[0])
fmt.Println(scores[1])
fmt.Println(scores[2])
}

配列の繰り返し処理

繰り返し処理を使用して配列の要素にアクセスすることもできます。 len関数を使用して配列の長さを取得し、forループで各要素にアクセスします。

forループを使った配列の繰り返し処理

package main

import (
"fmt"
)

func main() {
scores := [3]int{10, 20, 30}

// 配列の長さを取得して繰り返し処理
for i := 0; i < len(scores); i++ {
fmt.Println(scores[i])
}
}

rangeキーワードを使った配列の繰り返し処理

rangeキーワードを使用して、for分の代わりに、配列の要素に簡単にアクセスすることもできます。 indexとvalueの両方を取得できます。 indexは0から始まる配列のインデックス(要素番号)、valueはそのインデックスに対応する要素の値です。

構文:

for i, v := range array {
// i はインデックス
// v は要素の値
}
package main

import (
"fmt"
)

func main() {
scores := [3]int{10, 20, 30}

for i, score := range scores {
fmt.Println(i)
fmt.Println(score)
}
}

配列のコピー

Goの配列は値型であるため、配列を別の変数に代入すると、その配列のコピーが作成されます。(参照ではなく)

x := [3]int{1,2,3}
y := x
y[0] = 9

fmt.Println(x) // [1 2 3]
fmt.Println(y) // [9 2 3]

スライスの宣言と初期化

スライスは配列の柔軟なラッパーであり、動的にサイズを変更できます。 スライスの宣言と初期化は以下のように行います。

package main
import (
"fmt"
)
func main() {
// スライスの宣言と初期化
scores := []int{10, 20, 30}

// スライスの要素にアクセス
fmt.Println(scores[0])
fmt.Println(scores[1])
fmt.Println(scores[2])

// スライスの長さと容量を取得
fmt.Println("Length:", len(scores))
fmt.Println("Capacity:", cap(scores))
}

スライスの拡張

スライスは動的にサイズを変更できるため、append関数を使用して要素を追加できます。

package main

import (
"fmt"
)

func main() {
scores := []int{10, 20, 30}

// スライスに要素を追加
scores = append(scores, 40)

fmt.Println(scores)
}

配列 vs スライス(まとめ)

特徴配列スライス
サイズ固定長可変長
宣言方法[n]Type[]Type
メモリ管理値型(コピーされる)参照型(元の配列を指す)
柔軟性高くない高い

Goの配列は固定長で値型です。 実務ではスライスを使いますが、配列はスライスの基礎です。

配列とスライスの練習問題

以下の要件を満たすGoプログラムを作成してください。

  1. 配列arrを宣言し、初期値として"go""lang"を設定します。
  2. 配列arrを別の変数bに代入します。
  3. 変数bの最初の要素を"hello"に変更します。
  4. 配列arrと変数bの内容をそれぞれ出力します。
arr := [2]string{"go", "lang"}
b := arr
b[0] = "hello"

fmt.Println(arr)
fmt.Println(b)