🖥

Go言語の基本 — array と slice の違い

2023/08/26に公開

まとめ

  • slice は array より柔軟。
    • slice の方が、軽量プログラミング言語(Ruby)でいう array に近い。
    • だが、さすがに軽量プログラミング言語よりは柔軟じゃない。
  • slice は array を参照しているラッパーのようなもの。
    • slice をいじると、内部では基底となる array の状態が変わったり、新しいarrayがnewされたり、色々なことがおこなわれる。

宣言方法

array の場合

要素数と型を書く。

var a [3]int

slice の場合

要素数を書かない。これだけでsliceになる。

var s []int

宣言と同時に代入する

arrayの場合

後ろにに要素を並べる。

a := [3] int{1,2,3}

この書き方では、要素数は省略できる。
ただこれは後ろに書いた要素の数を自動でカウントしてくれているだけで、要素数を明記した場合と、何か実体が変わるわけではない。

a := [...] int{1,2,3}

slice の場合

arrayと記法は同じで、ブレースに要素を書く。

s := []int{1,2,3}

空配列/空スライス

arrayの場合

空配列を作ると、足りない値がすべて自動的に埋められる。

a := [3] int{}

fmt.Println(a) // [0 0 0]

sliceの場合

中身がそのとおり空になる。

s := []int{}

fmt.Println(s) [] // []

要素の追加

array の場合

そもそも要素の個数が決まっているので、要素の追加という概念がない。

slice の場合

append すれば良い。

s := []int{}

s = append(s, 1)
s = append(s, 2)
s = append(s, 3)

fmt.Println(s) // [1 2 3]

ただし、arrayより柔軟なsliceとはいえ、存在しない要素にいきなり代入することは出来ないようだ。

s := []int{}

s[0] = 1  // panic: runtime error: index out of range

型の表し方

arrayの場合

配列すべてを表す型というのは存在しない。

[要素数]型名

以下は全て別々の型として扱われる。

[3]int
[3]string
[4]int

slice の場合

[]型名

と表現する。

例:

[]string
[]int

環境

  • go version go1.8 darwin/amd64

参考

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2017-03-27

Discussion