あまり知られていないGoのスライス/配列の初期化
初めに
先日、こちらの動画で見たことがない配列の初期化をしていたので、それについてわかったことを解説してきます。
配列の初期化
動画のほうでは次のような配列宣言をしていました。
package main
var array = [...]int{0, 4:1, 2, 1:1}
func main() {
println(len(array))
}
一般的な配列やスライスの宣言は以下のパターンがあると思います
var slice1 = []int{1, 2, 3, 4}
var slice2 = make([]int, 1, 4)
var array1 = [10]int{1, 2, 3, 4}
var array2 = [...]int{1, 2, 3, 4}
これらはよく見かけるパターンですが、{0, 4:1, 2, 1:1}
というのは見たことがなく、どう読めばよいのかわかりませんでした。
これについてHajime Hoshi (星一)さんに教えていただきました。結論からいうと以下の処理と同じことをしています。
var array = [6]int{}
array[1] = 1
array[4] = 1
array[5] = 2
fmt.Println(array)
解説
配列、スライスではインデックスを指定して値をセットできます。
つまり{0, 4:1, 2, 1:1}
は、0
番目に0
、4:1
は4
番目に値1
、5
番目に2
、1
番目に1
をセットしています。
これは構造体の初期化時にフィールドを指定できるのと同じです。
gorilla := Animal{Name: "gorilla", Age: 28}
最後に
普通にGoを書いていたらこのような書き方は使わないんですが、構造体の初期化と同じ理屈と考えるとすごく腑に落ちます。 Go、奥が深い。。