🚧

[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() を使うのが一般的だと思う。