プログラミング超入門(４)〜GO言語〜

#データの集合体
##整数を要素とする配列
複数のデータの集合体を配列(Array)と呼び、配列を構成する１つ１つのデータを要素と呼びます。要素は決まった順番で保持され、その順番を示す数「インデックス」で区別されます。簡単に説明すると、変数が一つのデータしか入れられない箱だとしたら、配列は複数のデータ（箱＝要素）を格納することができるデータ型（要素数）収納ケースみたいなものと思って下さい。そして、配列のそれぞれの要素には住所みたいに場所の情報が割り当てられていてその番号が０（ゼロ）から始まるインデックス（添字）という番号を意味します。

|要素0|要素１|要素2|要素3|←１列の配列を「１次元配列」と呼びます|
|:---:|:---:|:---:|:---:|:---:|

二次元配列の場合はその1列の配列の中に配列が存在する状態のことをいいます。

|要素0(1列の配列)|要素1(1列の配列)|要素2(1列の配列)|要素3(1列の配列)|←要素の中が更に配列になっている二次元配列|
|:---:|:---:|:---:|:---:|:---:|

二次元配列は見方を変えると以下のような表のイメージになります。

|要素0の配列要素0|要素1の配列要素0|要素2の配列要素0|要素3の配列要素0|←1列目は各配列の要素0|
|:---:|:---:|:---:|:---:|:---:|
|要素0の配列要素1|要素1の配列要素1|要素2の配列要素1|要素3の配列要素1|←2列目は各配列の要素1|
|要素0の配列要素2|要素1の配列要素2|要素2の配列要素2|要素3の配列要素2|←3列目は各配列の要素2|

##配列を宣言する(作る)
`変数 := [要素数]データ型{データ１,データ２,データ３,データ４}`ソースコードにすると、

```StrArray.go
package main

import "fmt"

func main() {
    
    a := [3]string{"sato","suzuki","kikuchi"}
    fmt.Plintln(a[0])
    fmt.Plintln(a[1])
    fmt.Plintln(a[2])
}
```
###実行結果
```
sato
suzuki
kikuchi
```

次にprintf関数を用いて配列の要素を整数にし、文字列の中に整数を表す「%d」を使用し記述してみます。

```IntArray.go
package main

import "fmt"

func main() {
    
    intarray := [5]int{99, 122, 233, 456, 1023}
    fmt.Plintf("１番目の要素は%d\n",intarray[1])
}
```
###ファイルをビルドして実行
```
１番目の要素は１２２
```

```IntArray.go
package main

import "fmt"

func main() {
    
    intarray := [5]int{99, 122, 233, 456, 1023}
    fmt.Plintf("１番目の要素は%d\n",intarray[1])
    fmt.Plintf("0番目の要素は%d\n",intarray[0])
    fmt.Plintf("4番目の要素は%d\n",intarray[4])
    fmt.Plintf("2番目と3番目の要素を足すと%d\n",intarray[2]+intarray[3])
    intarray[1] -= 100
    fmt.Plintf("現在1番目の要素は%d\n",intarray[0])
}
```
###ファイルを再度ビルドして実行
```
１番目の要素は１２２
0番目の要素は99
4番目の要素は1023
2番目と3番目の要素を足すと６８９
現在1番目の要素は22
```

##配列とスライス
配列を使用する場合、先に要素数を [　] で決めるのですが、正確に必要な数を定めるのでなく、多く確保しておく分にはエラーは出ません。しかし、要素の数より[要素数]が下回っていると実行エラーになります。
`intarray1 := [50]int{99, 122, 233, 456, 1023}`←実行可能。
`intarray2 := [2]int{99, 122, 233, 456, 1023}`←エラーになります。
配列の情報を与えるデータ型として**スライス(slice)**というものがあります。要素数を決めない書き方です。
`intarray3 := []int{99, 122, 233, 456, 1023}`←その情報であるスライス型のデータが変数intarray3に代入されます。**len関数**を用いてスライスintarray3に代入されている要素数を確認してみましょう。

```Slice.go
package main

import "fmt"

func main() {
    
    intarray3 := []int{99, 122, 233, 456, 1023}

    fmt.Printf("スライスが見ている配列の要素数は%d\n", len(intarray3))
}
```
###実行結果
```
スライスが見ている配列の要素数は5
```
len関数を用いると最後の要素を取り出す時にインデックスは[配列の要素数ー(マイナス)１]となるので注意が必要です。またスライスが見ている配列の要素を変更することが出来ます。

```Slice.go
package main

import "fmt"

func main() {
    
    intarray3 := []int{99, 122, 233, 456, 1023}
    intarray3[1] -= 100
    
    fmt.Printf("スライスが見ている配列の要素数は%d\n", len(intarray3))
    fmt.Printf("最後の要素は%d\n", intarray3[ len(intarray3) -1 ])
    fmt.Printf("現在１番目の要素は%d\n", intarray3[1])
}
```
###ファイルを再度ビルドして実行
```
スライスが見ている配列の要素数は5
最後の要素は1023
現在1番目の要素は22
```

##スライスを[削ぎ取る]とは
スライスはもともと配列の一部を切り取った形で見るために用いられます。Go言語では実際に切り取って、別の値を作成したりするわけでなく元の配列を窓から見た時に得られる情報をそう呼んでいます。配列からスライスを作成する場合、配列のインデックスを記述する部分に`[切り取る最初のインデックス:切り取った最後のインデックス-１]`という表記をします。インデックスは配列が格納されている「順番ー(マイナス)１」なので、０(ゼロ)番目は一番最初の数字を指します。

```Shave.go
package main

import "fmt"

func main() {
    
    intarray := [５]int{99, 122, 233, 456, 1023}
    slice1_3 := intarray[1:4] //1番目から3番目(4-1)を切り取って見る
    slice0 := intarray[:1] //0番目から0番目(1-1)までを表す
    slice4 := intarray[4:] //4番目から4番目(5-1)までを表す

    fmt.Printf("slice1_3[1]は%d\n", slice1_3[1])
    fmt.Printf("slice0の要素数は%d\n", len(slice0))
    fmt.Printf("slice4[0]の値は%d\n", slice4[0])
}
```
###実行結果
```
slice1_3[1]は233
slice0の要素数は1
slice4[0]の値は1023
```
元の配列の１番目から３番目を切り取って「122,233,456」、その１番目に見えるのは(0番・`1番`・2番として)２３３です。次にslice0の要素数は０(ゼロ)番目一つなので、１が表示されます。最後にslice4で０(ゼロ)番目に見えるのは４番目一つしかないので(0番・1番・2番・3番・`4番`として)1023になります。スライスからも元の要素の値が変更できるか確認してみます。

```Shave.go
package main

import "fmt"

func main() {
    
    intarray := [５]int{99, 122, 233, 456, 1023}
    slice1_3 := intarray[1:4] //1番目から3番目(4-1)を切り取って見る
    slice0 := intarray[:1] //0番目から0番目(1-1)までを表す
    slice4 := intarray[4:] //4番目から4番目(5-1)までを表す
    slice1_3[2] -= 400

    fmt.Printf("slice1_3[1]は%d\n", slice1_3[1])
    fmt.Printf("slice0の要素数は%d\n", len(slice0))
    fmt.Printf("slice4[0]の値は%d\n", slice4[0])
    fmt.Printf("現在intarray[3]の値は%d\n", intarray[3])
}
```
###ファイルを再度ビルドして実行
```
slice1_3[1]は233
slice0の要素数は1
slice4[0]の値は1023
現在intarray[3]の値は56
```
slice1_3で操作した結果が元の配列intarrayの要素として取り出して反映した結果456-400=56と表示されました。GO言語のデータの集合体を扱うときは、配列よりスライスで見ていく方が多いようです。

[←前回の記事](https://qiita.com/ume-bar/items/8c14f2c6372e425fe3ed)　[次の記事へ→](https://qiita.com/ume-bar/items/2026b0a83a18c964d940)