まとめ
- 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
参考
- https://blog.golang.org/go-slices-usage-and-internals
- https://blog.golang.org/slices
- https://medium.com/@hackintoshrao/the-curious-case-of-golang-array-and-slices-2565491d4335#.7dwz3ujgt
- http://stackoverflow.com/questions/36706843/how-to-get-the-underlying-array-of-a-slice-in-go
- http://openmymind.net/Controlling-Array-Growth-In-Golang/
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。