はじめに
現代のソフトウェア開発において、我々はしばしば大量のデータを保存する必要があります。
学んだことを基にして、我々はたやすく多数の変数を定義することができます。
しかし、会社の社員の名前を記録するために変数を使用する必要があり、データが数百または数千の規模である場合、我々はそれらを一つ一つ定義しなければならないでしょうか?
もちろん違います。似たような属性を持つデータについては、配列を使用してそれらを定義および保存することができます。
我々は配列を、列車のようにまとまった変数のコレクションと考えることができます。そして、特定の変数を見つけたいとき、列車番号(配列名)と座席番号(インデックス)を知るだけです。その後、その名前を知らずに変数を見つけて操作することができます。
このセクションでは、配列のさまざまな基本操作について学びます。
ポイント:
- 配列の定義
- 配列の初期化
- 配列のトラバーサル
- 配列要素の特性
配列の定義
我々はどのように配列を定義するのでしょうか。
変数について学んだときの状況を思い出してみましょう。我々はどのようにint型の変数を定義しましたか。
var a int
すなわち:
var variable_name variable_type
同様に、我々はこのようにint型の配列を定義することができます。
var a [10]int
すなわち:
var variable_name [number_of_elements]variable_type
このようにして、我々は容量 10 の基本的なint型の配列aを定義しました。
初期化リスト
配列の定義方法を理解した後、配列の初期化方法を学びましょう。
配列を初期化する際、配列要素の初期値を設定するために初期化リストを使用することができます。
~/project ディレクトリに array.go ファイルを作成します。
cd ~/project
touch array.go
array.go に以下のコードを記述します。
package main
import "fmt"
func main() {
// 自動的に要素型のゼロ値に初期化されます
var simpleArray [3]int
// 指定された初期値で初期化し、欠けている要素はゼロ値で埋めます
var numArray = [3]int{1, 2}
// 指定された初期値で初期化します
var cityArray = [2]string{"London", "Chengdu"}
fmt.Println(simpleArray) // [0 0 0]
fmt.Println(numArray) // [1 2 0]
fmt.Println(cityArray) // [London Chengdu]
}
コードを実行します。
go run ~/project/array.go
予想される出力:
[0 0 0]
[1 2 0]
[London Chengdu]
上記のコードは、初期化リストを使用して初期値を指定する 3 つの方法を示しています。
- リストを渡さない場合:要素型のゼロ値に初期化されます
- 部分的なリストを渡す場合:指定された値で指定された要素を初期化し、残りの要素はゼロ値で初期化されます
- 完全なリストを渡す場合:指定された値で初期化されます
渡されたリストの長さが配列の要素数より大きい場合、コードはコンパイルされません。
推論された長さによる初期化
初期化リストを使用して配列を初期化する際、提供される初期値の数が要素数以下であることを確認する必要があります。
一般的に、コンパイラが初期値に基づいて配列の長さを推論することができます。
array.go ファイルを以下のように変更します。
package main
import "fmt"
func main() {
var simpleArray [3]int
var numArray = [...]int{1, 2}
var cityArray = [...]string{"London", "Chengdu"}
fmt.Println(simpleArray) // [0 0 0]
fmt.Println(numArray) // [1 2]
fmt.Printf("The type of numArray is: %T\n", numArray) // The type of numArray is: [2]int
fmt.Println(cityArray) // [London Chengdu]
fmt.Printf("The type of cityArray is: %T\n", cityArray) // The type of cityArray is: [2]string
}
コードを実行します。
go run ~/project/array.go
予想される出力:
[0 0 0]
[1 2]
The type of numArray is: [2]int
[London Chengdu]
The type of cityArray is: [2]string
指定されたインデックスでの初期化
時には、初期化リストを使用するか長さを推論するかに関係なく、配列の特定の位置に特定の初期値を割り当てたい場合があります。
array.go ファイルを以下のように変更します。
package main
import "fmt"
func main() {
a := [...]int{1: 1, 3: 5}
fmt.Println(a) // [0 1 0 5]
fmt.Printf("The type of array a is: %T\n", a) // The type of array a is: [4]int
}
コードを実行します。
go run ~/project/array.go
予想される出力:
[0 1 0 5]
The type of array a is: [4]int
上記のコードは、インデックス 1 と 3 の要素の初期値をそれぞれ 1 と 5 に指定しています。また、長さ初期化方法の推論も使用していますので、これを学んでおく必要があります。
注:コンピューティングにおいて、インデックスは 0 から始まります。
配列の反復処理
時には、配列の各要素にアクセスし、それぞれに対して操作を行う必要があります。
ここでは、配列をトラバースする 2 つの方法を紹介します。
array.go に以下のコードを記述します。
package main
import "fmt"
func main() {
a := [...]int{123, 321, 456, 777}
// 方法 1: range
fmt.Println("Traversing the array using range")
for index, value := range a {
fmt.Println(index, " ", value)
}
// 方法 2: インデックスを使用
fmt.Println("\nTraversing the array using indices")
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
}
コードを実行します。
go run ~/project/array.go
予想される出力:
Traversing the array using range
0 123
1 321
2 456
3 777
Traversing the array using indices
123
321
456
777
上記の両方の方法を使用して、配列全体をトラバースすることができます。
配列要素のアクセス
配列内の特定の要素にアクセスするには、実質的には変数であるため、インデックスを使用します。
ほとんどのプログラミング言語と同様に、配列のインデックスは 0 から始まり、最後の要素のインデックスは len-1 です。
コードでこの制限を超えるインデックスを使用すると、範囲外エラーが発生します。
a 配列の i 番目の要素にアクセスするには、次の表記を使用できます。
a[i]
すなわち:
array_name[index_of_element]
配列の値型
配列は値型です。配列を代入するか、パラメータとして渡すと、配列全体がコピーされます。言い換えると、コピーの値を変更することになり、元の配列には影響しません。
array.go に以下のコードを記述します。
package main
import "fmt"
func modifyArray(x [3]int) {
x[0] = 100
}
func main() {
a := [3]int{10, 20, 30}
modifyArray(a) // `modifyArray` 内の変数 `x` は `a` のコピーです
fmt.Println(a) // [10 20 30]
}
コードを実行します。
go run ~/project/array.go
出力は以下のようになります。
[10 20 30]
上記のコードから分かるように、a 配列を modifyArray 関数に渡すと、実際には元の配列のコピーのみが渡されます。
関数内の配列 x の値を変更しても、元の配列 a には影響しません。
まとめ
この実験では、以下のことを学びました。
- 配列を定義する方法
- 配列の初期化の 3 つの方法
- 配列の特性と要素にアクセスする方法
配列は実際の開発では一般的には使用されませんが、Go 言語で一般的に使用されるデータ構造を学ぶための基礎となります。
すべての Go 言語の学習者が一生懸命練習し、学んだことを応用できるようになることを願っています。



