配列
配列の宣言と、要素にアクセス
配列の宣言
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(配列名)
実行結果
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のタプルのようなものかと思ってたら違った
スライスの方が使い勝手が良さそうだなぁと漠然としたイメージ
要素数固定の時は配列を選択するのがベターなのか
参考
なし