[Golang] slice と array を理解する
👷♂️ 工事中 👷♂️
自分の理解度をたしかめるために、一度まとめてみる。
slice と array を定義する
array を定義すると、すべての要素にゼロ値が入る。
func main() {
var array [2]int
fmt.Println(array[0]) // 0
fmt.Println(array[1]) // 0
}
一方、同じように slice を定義すると、最初の要素にすらアクセスできない。
func main() {
var slice []int
fmt.Println(slice[0]) // panic: runtime error: index out of range [0] with length 0
fmt.Println(slice[1])
}
これは、array が値型であるのに対して、slice が参照型であることに起因する。 値型である array は変数を定義した時点で初期化されるけれど、参照型である slice は明示的にメモリを確保しないといけない。
正しくはこう定義する。
func main() {
slice := []int{0, 0}
// または
slice := make([]int, 2)
fmt.Println(slice[0]) // 0
fmt.Println(slice[1]) // 0
}
make()
は組み込み関数の 1 つで、slice や map、channel を初期化して使えるようにしてくれる。
単純に楽なので make()
を使うのが一般的だと思う。