概要
今回ブログポストではGolangでarray
(配列)を使って変数を宣言して使う方法について説明します。このブログポストで紹介するコードは次のリンクで確認できます。
配列
Golangで配列とは同じデータタイプのデータを保存するためのタイプで、連続したメモリにデータが保存されます。配列は次のように宣言して使うことができます。
var 変数名 [サイズ]タイプ
var a [5]int
次のように配列を宣言した場合、サイズは5で、int
タイプの値を保存する配列が生成され、初期値が設定されてないので、int
のデフォルトである0
が割り当てれます。
var a [5]int
配列を宣言する時配列のサイズは定数だけ使えます。変数を使う場合はコンパイルエラーが発生します。
const LEN = 5
var a = [LEN]int
// Error
len := 5
var b := [len]int
これを確認するためmain.go
ファイルを生成して次のように修正します。
package main
import "fmt"
func main() {
var a [5]int
fmt.Println(a)
const LEN = 5
var b [LEN]int
fmt.Println(b)
// ERROR
// var len = 5
// var c [len]int
// fmt.Println(c)
}
上のコードを実行すると次のような結果が表示されます。
# go run main.go
[0 0 0 0 0]
[0 0 0 0 0]
初期値
Golangで配列は次のように変数を宣言する時、初期値を設定することができます。
var a [5]int = [5]int{1, 2, 3, 4, 5}
// [1 2 3 4 5]
var a = [5]int{1, 2, 3, 4, 5}
// [1 2 3 4 5]
配列も変数の割り当てなので、次のように:=
(Short variable declarations)を使うことができます。
days := [3]string{"Mon", "Tue", "Wed"}
// [Mon Tue Wed]
初期値は次のように一部だけ設定することができますし、初期値が設定されてない部分には変数タイプのデフォルトが設定されます。
a := [5]int{1, 2}
// [1 2 0 0 0]
次のように特定な位置に初期値を設定することもできます。
a := [5]int{1: 10, 3: 30}
// [0 10 0 30 0]
次のように初期値を宣言すると、サイズが初期値と同じ配列が生成されます。
a := [...]int{1, 2, 3, 4, 5}
// [5]int
// [1 2 3 4 5]
次のように使う場合、サイズが固定されないslice
が生成されます。(配列ではない)
a := []int{1, 2, 3, 4, 5}
// []int
// [1 2 3 4 5]
これを確認するためmain.go
ファイルを次のように修正します。
package main
import "fmt"
func main() {
var a [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println(a)
var b = [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
days := [3]string{"Mon", "Tue", "Wed"}
fmt.Println(days)
e := [5]int{1, 2}
fmt.Println(e)
f := [5]int{1: 10, 3: 30}
fmt.Println(f)
g := [...]int{1, 2, 3, 4, 5}
fmt.Printf("%T\n", g)
fmt.Println(g)
h := []int{1, 2, 3, 4, 5}
fmt.Printf("%T\n", h)
fmt.Println(h)
}
これを修正すると次のような結果が表示されます。
[1 2 3 4 5]
[1 2 3 4 5]
[Mon Tue Wed]
[1 2 0 0 0]
[0 10 0 30 0]
[5]int
[1 2 3 4 5]
[]int
[1 2 3 4 5]
配列のコピー
配列は一般変数をコピーすることとはちょっと違います。
a := [...]int{1, 2, 3, 4, 5}
b := [...]int{10, 20, 30, 40, 50}
fmt.Println(a)
fmt.Println(b)
b = a
fmt.Println(a)
fmt.Println(b)
上の例題を見ると次のようなコードでは配列をコピーしてます。
b = a
配列のコピーはa
のメモリサイズだけをb
にコピーされます。配列は連続されたメモリにデータが保存されるので、a
をb
にコピーする時、値を一つづつコピーするではなくメモリをそのままコピーします。
したがって、配列のサイズが違うとコピーができないです。Golangは基本的両辺のタイプが同じじゃないとコピーができません。したがって、次のように[3]int
タイプの配列を[5]int
配列にコピーすることはできません。
c := [3]int{1, 2, 3}
d := [5]int{10, 20, 30, 40, 50}
// ERROR
d = c
fmt.Println(c)
fmt.Println(d)
多次元配列
Golangでも多次元配列を使えます。
var a [2][5]int
基本配列を使う方法と同じで、配列を宣言して初期値を設定することもできます。
package main
import "fmt"
func main() {
a := [2][5]int{
{1, 2, 3, 4, 5},
{10, 20, 30, 40, 50},
}
for _, arr := range a {
for _, v := range arr {
fmt.Print(v, " ")
}
fmt.Println()
}
}
上の内容を実行すると次のような結果が表示されます。
# go run main.go
1 2 3 4 5
10 20 30 40 50
完了
これでGolangで配列を宣言して使う方法についてみてみました。また、配列をコピーするため同じタイプとサイズの配列を使う必要があることが分かりました。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。