search
LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

あまり知られていない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番目に04:14番目に値15番目に21番目に1をセットしています。
これは構造体の初期化時にフィールドを指定できるのと同じです。

gorilla := Animal{Name: "gorilla", Age: 28}

最後に

普通にGoを書いていたらこのような書き方は使わないんですが、構造体の初期化と同じ理屈と考えるとすごく腑に落ちます。
Go、奥が深い。。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2