10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Go 2Advent Calendar 2020

Day 2

あまり知られていないGoのスライス/配列の初期化

Last updated at Posted at 2020-12-01

初めに

先日、こちらの動画で見たことがない配列の初期化をしていたので、それについてわかったことを解説してきます。

配列の初期化

動画のほうでは次のような配列宣言をしていました。

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、奥が深い。。

10
2
0

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
  3. You can use dark theme
What you can do with signing up
10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?