Go 言語の配列
Go 言語の配列
通常、複数の同じデータ型の変数がひと続きのメモリ領域に割り当てられ、そこにインデックスアクセスできるようになっているデータ構造を配列といいます。
Go では次の形式で配列を宣言します。
var 変数名 [配列のサイズ]型
配列の要素には [] を使ってインデックスアクセスできます。
配列の最初の要素のインデックスは 0 です。このため、配列のサイズ (配列に格納できる要素数) が 3 でも、最大のインデックスは 2 であることに注意しましょう。
Go では要素のデータ型 + 割り当てサイズを含めて一つの型として認識します。
Go には配列によく似たデータ構造として「スライス」があります。スライスではサイズは動的に割り当てられます。
Go の配列の宣言と初期化
次の例では string 型の要素を 3 個持つ配列 fruits を宣言して、 先頭の要素 fruits[0] から順に、 "Apple"、 "Banana"、 "Orange" という文字列をセットしています。
var fruits [3]string
fruits[0] = "Apple"
fruits[1] = "Banana"
fruits[2] = "Orange"
fmt.Println(fruits) // [Apple Banana Orange]
配列の宣言と同時に値を初期化するには、次のようにします。
var fruits [3]string = [3]string{"Apple", "Banana", "Orange"}
fmt.Println(fruits) // [Apple Banana Orange]
配列の初期化を行う時、 = の右側の型から配列の型がわかる場合には、 = の左側で型を書くことを省略できます。
var fruits = [3]string{"Apple", "Banana", "Orange"}
var を省略する場合は、通常の変数と同じく := を用いて次のように書きます。
fruits := [3]string{"Apple", "Banana", "Orange"}
配列を初期化するサイズを自動的に設定するには [要素数] の代わりに [...] と書きます。
fruits := [...]string{"Apple", "Banana", "Orange"}
要素数の記述を省略するとき [...] とせずに [] としても動作します。この場合、配列ではなくスライスとなります。
Go の配列の値をインデックスを指定して初期化するには、 インデックス:値 という形式で初期化子に指定します。
次の例ではインデックス 1、 3、 7 に値が設定されています。
a := [...]int{1: 111, 3: 333, 7: 777}
fmt.Println(a) // [0 111 0 333 0 0 0 777]
値が指定されていない配列の要素は、その型の既定値が設定されます。
Go の配列の比較
Go では配列を == 演算子で比較すると、全ての要素の値を比較し、全て同じ場合に true とします。
a := [...]int{1, 2, 3}
b := [...]int{1, 2, 3}
fmt.Println(a == b) // true
b[1] = 5
fmt.Println(a == b) // false
!= 演算子で比較した場合は、 == の結果の否定であり、 比較した二つの配列の要素が全て同じ場合に false で、それ以外は true です。
< や > 演算子は配列の比較に使用できません。
Go の配列と for ループ
Go では配列を for ループで利用する際、 range キーワードを用いてインデックスと、要素の値を取り出すことができます。
次の例では要素がrune 型の配列 a を {'A', 'B', 'C'] という値で初期化して作成して、 for-range を用いて配列のインデックスと、それに対応する値を取り出して表示しています
package main
import "fmt"
func main() {
a := [...]rune{'A', 'B', 'C'}
fmt.Printf("Type: %T\n", a)
for i, ch := range a {
fmt.Printf(" a[%d] = %c\n", i, ch)
}
}
go run main.go
Type: [3]int
a[0] = A
a[1] = B
a[2] = C