今回は、Arrayについて学習しましょう。
<目次>
学習履歴
Array(配列)とは

Arrayは、たくさんのデータを一纏めにするために使用します。
例えば、「住所の一覧」、「電話番号リスト」、「商品一覧」など一纏めにしたいデータを格納するときに便利です。
Arrayは、次のように表されます。
1 |
var myArray [4]string |
Arrayは、0から要素を指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package main import ( "fmt" ) func main() { var myArray [4]string myArray[0] = "Index0" myArray[1] = "Index1" myArray[2] = "Index2" myArray[3] = "Index3" fmt.Println(myArray) } |
1 2 |
$ go run main.go [Index0 Index1 Index2 Index3] |
Arrayの初期値

Arrayの初期値について見てみましょう。
Arrayの初期値は、typeに依存します。
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 |
package main import ( "fmt" ) func main() { var myIntArray [3]int myIntArray[1] = 10 myIntArray[2] = 20 fmt.Println(myIntArray[0]) fmt.Println(myIntArray[1]) fmt.Println(myIntArray[2]) fmt.Println("--------------------------------") var myStringArray [3]string myStringArray[1] = "test" myStringArray[2] = "test2" fmt.Println(myStringArray[0]) fmt.Println(myStringArray[1]) fmt.Println(myStringArray[2]) } |
1 2 3 4 5 6 7 8 |
$ go run main.go 0 10 20 -------------------------------- test test2 |
Int typeの場合は、初期値が0, String typeの場合は、初期値が””(空)ですね。
このようにArrayは、typeの初期値を伴って作成されます。
Array リテラル
Arrayを宣言する時、初期化と共に値を格納することができます。
1 2 |
// example myArray := [3]int{1, 2, 3} |
簡単なプログラムを書いて、理解を深めましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} for i := 0; i < 3; i++ { fmt.Println(myArray[i]) } } |
1 2 3 4 |
$ go run main.go 1 2 3 |
fmtパッケージとArray
Arrayの要素を出力する時、fmtパッケージのPrint関数で、以下のようにも出力できます。
1 2 3 4 5 6 7 8 9 10 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} fmt.Println(myArray) } |
1 2 |
$ go run main.go [1 2 3] |
一つ一つ、インデックス指定で値を取り出す必要がないのです。
フォーマット出力にて、もう少し詳しい情報を表示することもできます。
1 2 3 4 5 6 7 8 9 10 11 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} fmt.Printf("%#v\n", myArray) } |
1 2 |
$ go run main.go [3]int{1, 2, 3} |
Arrayの長さ(len関数)
Arrayの長さは、len関数にて確認可能です。
1 2 3 4 5 6 7 8 9 10 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} fmt.Println(len(myArray)) } |
1 2 |
$ go run main.go 3 |
これは、loop処理などと組み合わせると便利です。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} for i := 0; i < len(myArray); i++ { fmt.Println(myArray[i]) } } |
1 2 3 4 |
$ go run main.go 1 2 3 |

このパターンは、現場でもよく使いますね。
for…rangeで安全なループ
len関数より安全なループ処理として、“for…range”があります。
1 2 3 |
for index, value := range myArray { // process } |
先ほどのコードを修正してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} for i, v := range myArray { fmt.Println(i, v) } } |
1 2 3 4 |
$ go run main.go 0 1 1 2 2 3 |

すみません、こっちの方がよく使われます!
Arrayの要素外にアクセスすることがないので、こちらを使う方が安全だと思われます。
1 2 3 4 5 6 7 8 9 10 |
myArray := [3]int{1, 2, 3} for i := 0; i < len(myArray); i++ { fmt.Println(myArray[i+1]) //誤ってインクリメントしてしまうとOutofRangeエラーになる } // 要素外にアクセスすることはない for i, v := range myArray { fmt.Println(i, v) } |
ちなみに、for…rangeは、エラーオブジェクトと同じように、_(アンダースコア)を使うこともできます。

まずは、_(アンダースコア)を使わないとどうなるか見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} for i, v := range myArray { fmt.Println(v) } } |
indexを省略して見ました。プログラムを実行します。
1 2 3 |
$ go run main.go # command-line-arguments ./main.go:9:6: i declared and not used |
エラーになりますね。このように、for…rangeは、indexとvalueの両方を使う必要があります。

では、_(アンダースコア)を使ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" ) func main() { myArray := [3]int{1, 2, 3} for _, v := range myArray { fmt.Println(v) } } |
1 2 3 4 |
$ go run main.go 1 2 3 |
今度は、エラーを回避できましたね^^
Arrayとファイル処理

Arrayとファイル処理は、切っても切れない関係です。
Arrayが真価を発揮するのは、多量のデータを扱う時でしょう。
次のファイルを作成してください。
1 2 |
touch readfile.go touch data.txt |
readfile.goは、ファイルを読みこむプログラムを書きます。data.txtは、float型のデータを格納します。
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 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package main import ( "bufio" "fmt" "log" "os" "strconv" ) func getFoats(fileName string) ([3]float64, error) { var numbers [3]float64 file, err := os.Open(fileName) if err != nil { return numbers, err } // Close the file to free resource defer file.Close() i := 0 // Create a new Scanner fot the file scanner := bufio.NewScanner(file) // Read a line from the file for scanner.Scan() { numbers[i], err = strconv.ParseFloat(scanner.Text(), 64) if err != nil { return numbers, err } i++ } if scanner.Err() != nil { return numbers, scanner.Err() } return numbers, nil } func main() { numbers, err := getFoats("data.txt") if err != nil { log.Fatal(err) } for _, v := range numbers { fmt.Println(v) } } |
1 2 3 4 5 |
data.txt 10.20 30.40 50.60 |
実行します。
1 2 3 4 |
$ go run readfile.go 10.20 30.40 50.60 |
上記のサンプルは、os.Open関数にて、ファイルから読み取った値をArrayに格納して処理をしています。また、テキストから読み込んだ値はString型になります。そのため、Float型に変換する処理を加えてます。
まとめ

最後に本章で学習したことをまとめて終わりにしましょう。
・ Arrayは、次のように宣言をする -> var myArray [3]int
・ Arrayのindex値は、”0″から始まる
・ Arrayの初期値は、宣言したtypeよって決まる
・ Arrray リテラルによって次のように宣言ができる -> [3]int{4, 2, 5}
・ Arrayのindex外にアクセスすると処理落ちする
・ Arrayの要素数を数えるには、”len”関数を使う
・ Arrayのループ処理には、for … rangeループが安全
・ for … rangeループ時に、_(アンダースコア)を使うと処理をスキップできる
・ os.Open関数でファイルをオープンする
・ bufio.NewScannerで1行ごとの読み取りを行い、string型で返す
参考書籍
次回
次回は、Sliceを学習しましょう!
コメントを残す
コメントを投稿するにはログインしてください。