Goの配列宣言について解説
Goで配列を宣言する方法を簡単に解説します。
基本的な宣言と初期化の方法を中心に、実用的な記述例や書き方のポイントを紹介します。
開発環境が整っている方向けに、シンプルで分かりやすい内容にしているので、すぐに実践してみることができます。
基本的な配列宣言の方法
固定長配列の宣言
配列の基本構文
Go言語では、配列は固定長のデータ構造であり、宣言時に要素数と型を指定します。
基本構文は以下のようになります。
package main
import "fmt"
func main() {
// 5要素の整数型配列を宣言
var numbers [5]int
fmt.Println("numbers:", numbers)
}
numbers: [0 0 0 0 0]
宣言と同時の初期値設定
配列は宣言と同時に初期値を設定することもできます。
この場合、各要素に直接値を割り当てる形となります。
package main
import "fmt"
func main() {
// 文字列型の配列を宣言し、初期値を設定
var fruits = [3]string{"りんご", "みかん", "ぶどう"}
fmt.Println("fruits:", fruits)
}
fruits: [りんご みかん ぶどう]
配列の初期化方法
初期値の省略形
要素数を明示的に記述せず、初期値からサイズを自動推定することが可能です。
記号...
を利用して配列の長さを省略します。
package main
import "fmt"
func main() {
// 配列のサイズは要素数から自動で決定される
numbers := [...]int{10, 20, 30, 40}
fmt.Println("numbers:", numbers)
}
numbers: [10 20 30 40]
インデックス指定による初期化
特定のインデックスに対して初期値を設定することができます。
未指定の要素は型のゼロ値が設定されます。
package main
import "fmt"
func main() {
// インデックス2と4に値を割り当て、その他は0が入る
arr := [5]int{2: 100, 4: 200}
fmt.Println("arr:", arr)
}
arr: [0 0 100 0 200]
配列宣言時の留意点
配列のサイズとメモリ管理
固定サイズの特徴
配列は宣言時にサイズが確定しているため、サイズ変更ができません。
メモリの割り当てはコンパイル時に行われるため、実行時のパフォーマンスに影響を及ぼすことは少ないですが、サイズ固定である点に注意が必要です。
package main
import "fmt"
func main() {
// 配列は一度サイズが決まると変更不可能
var fixedArray [3]int = [3]int{1, 2, 3}
fmt.Println("fixedArray:", fixedArray)
}
fixedArray: [1 2 3]
型の整合性と変換
配列とSliceの違い
Goでは、配列は固定長のデータ構造ですが、Sliceはサイズ変更が可能な参照型です。
Sliceは配列の一部または全体を柔軟に扱うために利用されることが多く、言語全体で頻繁に使用されます。
package main
import "fmt"
func main() {
// 固定長配列
fixedArray := [3]int{1, 2, 3}
// スライス(固定長配列とは異なり、柔軟に要素を操作可能)
slice := []int{1, 2, 3}
fmt.Println("fixedArray:", fixedArray)
fmt.Println("slice:", slice)
}
fixedArray: [1 2 3]
slice: [1 2 3]
型変換の注意点
配列はサイズが型の一部となるため、同じ要素型を持っていてもサイズが異なる場合、型変換は自動で行われません。
また、サイズが同じ配列同士は直接比較が可能です。
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := [3]int{1, 2, 3}
// 同じサイズの配列同士は比較可能
if a == b {
fmt.Println("a と b は同じ内容です")
}
// [4]intと[3]intの間での自動変換は行われない
}
a と b は同じ内容です
応用例と実践パターン
複数次元配列の宣言
2次元配列の生成例
配列は多次元にも対応しています。
2次元配列は、行列のようなデータ構造を扱う際に便利です。
package main
import "fmt"
func main() {
// 2行3列の2次元配列を宣言
matrix := [2][3]int{
{1, 2, 3}, // 1行目
{4, 5, 6}, // 2行目
}
fmt.Println("matrix:", matrix)
}
matrix: [[1 2 3] [4 5 6]]
高次元配列の使い方
必要に応じて、3次元以上の配列を利用することも可能です。
複雑なデータ構造を扱う場合に活用できます。
package main
import "fmt"
func main() {
// 2x2x2の3次元配列を宣言
cube := [2][2][2]int{
{
{1, 2}, // 第1層、1行目
{3, 4}, // 第1層、2行目
},
{
{5, 6}, // 第2層、1行目
{7, 8}, // 第2層、2行目
},
}
fmt.Println("cube:", cube)
}
cube: [[[1 2] [3 4]] [[5 6] [7 8]]]
配列からSliceへの変換
基本的な変換方法
配列からSliceへの変換は、slice式[:]
を利用して簡単に行うことができます。
これにより、配列全体あるいは一部を柔軟に取り扱えます。
package main
import "fmt"
func main() {
// 配列を宣言
array := [4]int{10, 20, 30, 40}
// 配列全体を参照するスライスを生成
slice := array[:]
fmt.Println("array:", array)
fmt.Println("slice:", slice)
}
array: [10 20 30 40]
slice: [10 20 30 40]
利用シーンの紹介
配列からSliceへ変換することで、部分的なデータの抽出や可変長のデータ操作が容易になります。
例えば、特定範囲の要素を取り出す際に役立ちます。
package main
import "fmt"
func main() {
// 配列を用意
data := [5]int{2, 4, 6, 8, 10}
// インデックス1から3までの要素を含むスライスを生成
subSlice := data[1:4]
fmt.Println("data:", data)
fmt.Println("subSlice:", subSlice)
}
data: [2 4 6 8 10]
subSlice: [4 6 8]
コード記述のポイント
読みやすさと保守性の向上
シンプルな記述技法
コード記述では、冗長な記述を避け、シンプルな配列宣言を心掛けることで、可読性が向上します。
必要な情報だけを明確に記述することで、後からコードを見直す際にも理解しやすくなります。
package main
import "fmt"
func main() {
// シンプルな配列宣言により可読性を向上
scores := [3]int{85, 90, 95}
fmt.Println("scores:", scores)
}
scores: [85 90 95]
命名規則の工夫
変数名や関数名には意味のある英語表記を使用することで、複数人での開発や長期的なメンテナンスが行いやすくなります。
統一感のある命名規則を採用すると、コード全体の整理が容易になります。
package main
import "fmt"
func main() {
// 意味のある英語表記を使用した配列宣言例
var userAges = [4]int{25, 30, 35, 40}
fmt.Println("userAges:", userAges)
}
userAges: [25 30 35 40]
まとめ
本記事では、Go言語における固定長配列の宣言と初期化方法、配列のサイズや型の留意点、複数次元配列やSlice変換の応用例、そして読みやすく保守性の高いコード記述技法を紹介しました。
これらの内容を通して、Goでの配列利用と実践的なコード記述の方法が把握できることが分かります。
ぜひ、サンプルコードを実行しながら、自分のプロジェクトに取り入れてみてください。