[Golang] 配列(Array)

2021-10-18 hit count image

Golangで配列(Array)を定義して使う方法について説明します。

概要

今回ブログポストでは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にコピーされます。配列は連続されたメモリにデータが保存されるので、abにコピーする時、値を一つづつコピーするではなくメモリをそのままコピーします。

したがって、配列のサイズが違うとコピーができないです。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で開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts