Skip to Content

入門Goプログラミング Lesson16(配列)から学んだこと

配列

配列の宣言と、要素にアクセス

配列の宣言

1
	var sfc [3]string // 3個の要素を持つ配列を宣言 

要素の値を代入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import "fmt"

func main() {
	var sfc [3]string

	// インデックスに代入
	sfc[0] = "聖剣3"
	sfc[1] = "クロノトリガー"
	sfc[2] = "マリオRPG"

	cassette := sfc[1] //インデックス1の値を取り出す
	fmt.Println(cassette)
}

実行結果

クロノトリガー

配列の要素数カウント

len(配列名)

1
	fmt.Println(len(sfc))

実行結果

3

配列を複合リテラルで初期化

複合リテラルはどんな複合型でも好きな値で初期化できる

1行表記の場合

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
	sfc := [3]string{"聖剣3", "クロノトリガー", "マリオRPG"}
	fmt.Println(sfc[0])
}

実行結果

聖剣3

複数行に分けた場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {
	players := [...]string{ // ...にすると要素数はコンパイラが数えてくれる
		"デュラン",
		"ケヴィン",
		"ホークアイ",
		"アンジュラ",
		"シャルロット",
		"リース", // 最後にもカンマが必要
	}

	fmt.Println(players[1])
	fmt.Println(len(players))
}

実行結果

ケヴィン
6

配列を巡回処理する

rangeを使う

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import "fmt"

func main() {
	players := [...]string{ // ...にすると要素数はコンパイラが数えてくれる
		"デュラン",
		"ケヴィン",
		"ホークアイ",
		"アンジュラ",
		"シャルロット",
		"リース", // 最後にもカンマが必要
	}

	// rangeでforをまわす
	for i, player := range players {
		fmt.Println(i, player)
	}
}

実行結果

0 デュラン
1 ケヴィン
2 ホークアイ
3 アンジュラ
4 シャルロット
5 リース

配列はコピーされる

新しい変数に配列をそのまま代入するだけ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func main() {
	players := [...]string{ // ...にすると要素数はコンパイラが数えてくれる
		"デュラン",
		"ケヴィン",
		"ホークアイ",
		"アンジュラ",
		"シャルロット",
		"リース", // 最後にもカンマが必要
	}

	playersRemake := players // players配列をコピー

	players[1] = "狼" // オリジナルの配列を変更

	fmt.Println(players)
	fmt.Println(playersRemake)

}

実行結果

[デュラン 狼 ホークアイ アンジュラ シャルロット リース]
[デュラン ケヴィン ホークアイ アンジュラ シャルロット リース]

memo
配列は複数の値であり、関数は値渡しです
関数内で書き換えてもオリジナルには影響がない

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

func main() {
	players := [...]string{ // ...にすると要素数はコンパイラが数えてくれる
		"デュラン",
		"ケヴィン",
		"ホークアイ",
		"アンジュラ",
		"シャルロット",
		"リース", // 最後にもカンマが必要
	}

	remake(players)
	fmt.Println(players)
}

func remake(players [6]string) {
	for i := range players {
		players[i] = "Remake " + players[i]
	}
	fmt.Println(players)
}

実行結果

[Remake デュラン Remake ケヴィン Remake ホークアイ Remake アンジュラ Remake シャルロット Remake リース]
[デュラン ケヴィン ホークアイ アンジュラ シャルロット リース]

2次元配列

取り出し方がPythonと比べると分かりにくい印象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import "fmt"

func main() {
	var party [3][2]string
	party[0][0] = "ケヴィン"
	party[0][1] = "光光"
	party[1][0] = "ホークアイ"
	party[1][1] = "闇光"
	party[2][0] = "アンジュラ"
	party[2][1] = "闇闇"

	// 配列全部表示
	for _, player := range party {
		fmt.Println(player)
	}
	fmt.Println("---")

	// 特定キャラだけ表示
	for _, playChara := range party[1] {
		fmt.Println(playChara)
	}
	fmt.Println("---")

	// キャラクター表示
	for _, character := range party {
		fmt.Println(character[0])
	}
	fmt.Println("---")

	// クラスだけ表示
	for _, charaClass := range party {
		fmt.Println(charaClass[1])
	}
}

実行結果

[ケヴィン 光光]
[ホークアイ 闇光]
[アンジュラ 闇闇]
---
ホークアイ
闇光
---
ケヴィン
ホークアイ
アンジュラ
---
光光
闇光
闇闇

まとめ

  • 要素は固定長
  • 要素の変更は可能

感想

配列はPythonのタプルのようなものかと思ってたら違った
スライスの方が使い勝手が良さそうだなぁと漠然としたイメージ
要素数固定の時は配列を選択するのがベターなのか

参考

なし