配列(array)は、同じ型の値をいくつでも格納できる型です。このように複数の値を格納できる型のことを、コレクションと言います。
package main
import "fmt"
func main() {
var array [5] int
println(array[0])
println(len(array))
fmt.Println(array)
//println(array) エラーになる
}
0
5
[0 0 0 0 0]
var array [5] int
配列の定義は、var キーワード、配列名(変数名)、配列に格納するデータの個数を [ と ] で囲み指定、配列の値の型、と記述します。
コレクションの各データのことは、要素(element)と言います。
println(array[0])
配列の値を取り出すには、配列名[番号]と記述します。この番号のことをインデックス(index)と言います。インデックスは、最初の要素は 0 から始まります。つまり 5 個の要素の配列のインデックスは、0、1、2、3、4 になります。
初期化されていない int 型のデータは、0 になります。
println(len(array))
len 関数は、引数のコレクションの要素数を返します。
fmt.Println(array)
<>
fmt パッケージの Println 関数を使えば、コレクション全体の値を表示することができます。main パッケージの println 関数でコレクション全体の値を表示しようとするとエラーのなります。
package main
import "fmt"
func main() {
var intArray [3] int
intArray[0] = 100
intArray[1] = 200
intArray[2] = 300
fmt.Println(intArray)
strArray := [3] string {"abc", "def", "ghi"}
fmt.Println(strArray)
floatArray := [...] float64 {0.1, 0.2, 0.3}
fmt.Println(floatArray)
}
[100 200 300]
[abc def ghi]
[0.1 0.2 0.3]
intArray[0] = 100
要素の値を初期化(または変更)するには、配列名[インデックス]に値を代入します。
strArray := [3] string {"abc", "def", "ghi"}
配列の定義と初期化を同時に行うには、:= を使った簡略定義をしなければなりません。基本型のような var str string = "abc" のようにはできません。また配列の場合は代入される値から型推論することもできないので、値の型を省略することもできません。
floatArray := [...] float64 {0.1, 0.2, 0.3}
簡略定義では、要素の数は、代入する値から推論することができます。要素の数を省略を省略する場合は、[...]と記述します。
float64 は、Go 言語において、浮動小数点数を表す型です。
Go の配列は、一度定義すると、あとから要素を追加することはできません。
C 言語の配列名は、アドレスを表すポインターになっていますが、Go の配列名は、ポインターではありません。通常の値型です。
Go には、要素を追加することができ、かつ、識別名がポインターとなっている、スライスというものが用意されています。
Go の配列を簡略定義する場合に、要素数を省略する場合は、必ず [...] というように、... を含めなければなりません。もし、[ ] と、中に何も書かなかった場合は、スライスとして定義されます。
Go には、コレクションから値を一つずつ取り出すために使える range というキーワードがあります。
for と range を組み合わせることによって、コレクションから値を順番に取り出して、繰り返し処理をすることができます。
for と range の組み合わせは、他のプログラミング言語の foreach と同じものだと思ってください。
package main
import ("math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
dice := [...] int {rand.Intn(6)+1, rand.Intn(6)+1, rand.Intn(6)+1}
for i, v := range dice {
println(i+1, "回目は", v, "です")
}
println("----------------------")
names := [...] string {"John", "Kate", "Jane"}
for _, v := range names {
println("名前は", v, "です")
}
}
1 回目は 6 です
2 回目は 5 です
3 回目は 1 です
----------------------
名前は John です
名前は Kate です
名前は Jane です
for i, v := range dice {
for で繰り返し処理することを宣言しています。
i と v は、配列から取り出される、インデックス番号とその値を、それぞれ受け取るための変数です。
i と v という変数名は、好きな名前にすることができます。
この 2 つの変数を、省略することはできません。
range dice(配列名)とすることによって、その配列から、インデックス番号とその値が、順番に取り出されます。
for _, v := range names {
Go では、定義された変数を使わなければ、エラーになります。しかし、変数名を _(アンダースコア、アンダーバー)にすれば、その変数を無視して、使わずにすませることができます。