---
# System prepended metadata

title: データの集合体
tags: [1日で基本が身につくGo言語]

---

# データの集合体
　
# 整数を要素とする配列
 
 複数のデータの集合体<u>**配列（Araay）**</u>と呼ぶ。また配列を構成する一つ一つのデータを<u>**要素**</u>と呼ぶ。要素は決まった順番で保持され、その順番を示す数を<u>**インデックス**</u>で区別される
 
 参考コード
 
 `package main`

`import "fmt"`

`func main() {`
	`intvals := [5]int{98, 125, 232, 147, 486}
	fmt.Printf("1番目の要素は%d\n", intvals[1])`
 
 上記のコードではintvals（変数に指定された文字）に<u>**5つの整数型の要素**</u>を持たせており、<u>**「intvals[1]」で1番目の要素を取り出している**</u>。Go言語を含め、他のプログラミング言語でも、<u>**配列の要素は１番目から始まるのではなく０番目から始まる事を覚えておく**。</u>
 つまり、ここでは<u>**intvalsの1番目の配列は**</u>98ではなく<u>**125**</u>であり、<u>**98は0番目の配列**</u>となる。
 取り出された要素は<u>**%d**</u>に埋め込まれる
 
 
 # 配列とスライス
 上記のコードで書いたように、配列を使う場合は<u>**要素の数を先に決めなければいけない**</u>。これはデータ型の宣言と同様、メモリーなどの<u>**リソースを無駄にしない**</u>よう、最初から処理すべきものの大きさを決めているからである。
 要素の数を正確な数にしなければいけないわけではなく、必要な数よりも<u>**多く確保しておく分にはエラーにはならない**</u>。今回の参考書のプログラミング程度であれば、以下のコードの様に100個くらい確保しても問題はならない。
 
 intvals :=[100]int{98,125,232,147,486,}　`←エラーにはならない`
 intvals :=[3]int{98,125,232,147,486,} 　　`←実行エラーになる`
 
 さらに簡略化すると以下のように要素数を決めずに、配列を作成する方法がある。
 
 intvals :=[]int{98,125,232,147,486,}
 
 この書き方は配列そのものではなく、配列の情報を与えるデータ型でスライス(slice)と呼ぶ
 
`package main`

`import "fmt"`

`func main() {`
	`intvals3 := []int{98, 125, 232, 147, 486}`
    
	`fmt.Printf("このスライスが見ている配列の要素数は%d\n", len(intvals3))`
`}`

`実行結果:このスライスが見ている配列の要素数は5`

上記のコードでは<u>**len関数**</u>を用いて<u>**スライスintvals3が見ている配列の要素数を取得**</u>している。このようにスライスは要素数を気にせず、配列を記述し、<u>**あとから要素数を確認できる**</u>のが便利なところである。
 
 len関数を用いると、スライスが見ている配列の最後の要素を以下のように取り出せる。最後の要素のインデックスは「配列の要素数-1」になることに注意
 
   
`package main`

`import "fmt"`

`func main() {`
	`intvals3 := []int{98, 125, 232, 147, 486}`
    
	`fmt.Printf("このスライスが見ている配列の要素数は%d\n", len(intvals3))`
　　 `fmt.Printf("最後の要素は%d\n", intvals3[len(intvals3)-1])`
`}`

`実行結果`
`このスライスが見ている配列の要素数は5`
`最後の要素は486(追加された出力結果)`

スライスを通じて、スライスが見ている配列の要素の変更が可能である。

   
`package main`

`import "fmt"`

`func main() {`
	`intvals3 := []int{98, 125, 232, 147, 486}`
    `intvals3[1] -= 100`
	`fmt.Printf("このスライスが見ている配列の要素数は%d\n", len(intvals3))`
　　 `fmt.Printf("最後の要素は%d\n", intvals3[len(intvals3)-1])`
    `fmt.Printf("今や1番目の要素は%d\n", intvals3[1])`
`}`

`実行結果`
`このスライスが見ている配列の要素数は5`
`最後の要素は486(追加された出力結果)`
`今や1番目の要素は25`

なぜ「スライス（そぎ取る）」と呼ばれているのか。それは、もともとスライスは配列の一部分を切り取った形で見るために用いたからである。厳密にいえば、本当に切り取っているのではなく、元の配列を「小さな窓から見た」時に得られる情報なのである。


参考コード

`package main`

`import "fmt"`

`func main() {`
	`intarray := [5]int{98, 125, 232, 147, 486}`
	`slice13 := intarray[1:4]`
	`slice0 := intarray[:1]`
	`slice4 := intarray[4:]`

`}`


配列からスライスを作成するとき、配列のインデックスを記述する部分に<U>**「（切り取る最初のインデックス：切り取った最後のインデックス+１）」という表記**</U>をします。ゆえに、<U>**[1:4]は1番目から3番目（4-1）**</U>である。
また、<U>**切り取る部分が最初、もしくは最後の要素に及ぶ場合はそれらを省く事が可能**</U>である。よって上記のコードのslice0、slice4はそれぞれ「0番目から0番目」「4番目から4番目になる」
これらを確認するために上記のコードに実行を促すコードを追加すると

`package main`

`import "fmt"`

`func main() {`
	`intarray := [5]int{98, 125, 232, 147, 486}`
	`slice13 := intarray[1:4]`
	`slice0 := intarray[:1]`
	`slice4 := intarray[4:]`
    
    fmt.Printf("slice13[1]は%d\n", slice13[1])
	fmt.Printf("slice0の要素は%d\n", len(slice0))
	fmt.Printf("slice4[0]の値は%d\n", slice4[0])

`}`

`実行結果`
`slice13[1]は232`
`slice0の要素は1`
`slice4[0]の値は486`

となる。
スライスからも元の配列の要素の値を変更できる。

`package main`

`import "fmt"`

`func main() {`
	`intarray := [5]int{98, 125, 232, 147, 486}`
	`slice13 := intarray[1:4]`
	`slice0 := intarray[:1]`
	`slice4 := intarray[4:]`
    `slice13[2] -= 100`
    
    fmt.Printf("slice13[1]は%d\n", slice13[1])
	fmt.Printf("slice0の要素は%d\n", len(slice0))
	fmt.Printf("slice4[0]の値は%d\n", slice4[0])
    fmt.Printf("今やintarray[3]の値は%d\n", intarray[3])

`}`

`実行結果`
`slice13[1]は232`
`slice0の要素は1`
`slice4[0]の値は486`
`今やintarray[3]の値は47`

 ###### tags:`1日で基本が身につくGo言語`