📌
[1分学習]Go言語 スライス検証
はじめに
スライスについて、手元で検証していなかったので理解を深めるために検証コードを書きました。
スライスについての理解
- 配列とは違う
- 配列を参照する
- 組み込み関数appendを利用することで、固定長の配列操作における容量不足時の処理(十分な容量の配列を作って要素コピーしてという面倒な部分)を請け負ってくれる
配列とスライスの関係がわかるサンプルコードを書きました
- 検証コード
package main
import (
"fmt"
)
func main() {
fmt.Println("配列arrを長さ10キャパシティ100で作成")
arr := make([]int, 10, 100)
for i := 0; i < len(arr); i++ {
arr[i] = i
}
fmt.Println("len(arr): ", len(arr))
fmt.Println("cap(arr): ", cap(arr))
fmt.Println("---配列arrを元に、スライスs1を作成するとキャパシティはそのまま")
s1 := arr[:]
fmt.Println("len(s1): ", len(s1))
fmt.Println("cap(s1): ", cap(s1))
fmt.Println("s1: ", s1)
fmt.Println("------配列とスライスが参照の関係にあることを検証。スライスs1の0番目を100に変更すると配列arrの先頭が100になる")
s1[0] = 100
fmt.Println("s1: ", s1)
fmt.Println("arr: ", arr)
fmt.Println("---配列arrを元に、len==capで切ったスライスs2を作成")
s2 := arr[0:3:3]
fmt.Println("len(s2): ", len(s2))
fmt.Println("cap(s2): ", cap(s2))
fmt.Println("s2: ", s2)
fmt.Println("------キャパシティを自動的に増やすことを検証。スライスs2にappendを使って要素を追加するとcapが倍に増える")
s2 = append(s2, 3)
fmt.Println("len(s2): ", len(s2))
fmt.Println("cap(s2): ", cap(s2))
fmt.Println("s2: ", s2)
fmt.Println("------倍以上の要素数を追加しても対応してくれることを検証。スライスs2にappendを使ってarrの全要素を追加するとcap==lenまで増える")
s2 = append(s2, arr[:]...)
fmt.Println("len(s2): ", len(s2))
fmt.Println("cap(s2): ", cap(s2))
fmt.Println(s2)
}
- 結果
配列arrを長さ10キャパシティ100で作成
len(arr): 10
cap(arr): 100
---配列arrを元に、スライスs1を作成するとキャパシティはそのまま
len(s1): 10
cap(s1): 100
s1: [0 1 2 3 4 5 6 7 8 9]
------配列とスライスが参照の関係にあることを検証。スライスs1の0番目を100に変更すると配列arrの先頭が100になる
s1: [100 1 2 3 4 5 6 7 8 9]
arr: [100 1 2 3 4 5 6 7 8 9]
---配列arrを元に、len==capで切ったスライスs2を作成
len(s2): 3
cap(s2): 3
s2: [100 1 2]
------キャパシティを自動的に増やすことを検証。スライスs2にappendを使って要素を追加するとcapが倍に増える
len(s2): 4
cap(s2): 6
s2: [100 1 2 3]
------倍以上の要素数を追加しても対応してくれることを検証。スライスs2にappendを使ってarrの全要素を追加するとcap==lenまで増える
len(s2): 14
cap(s2): 14
[100 1 2 3 100 1 2 3 4 5 6 7 8 9]
Discussion