[1分学習]Go言語 スライス検証

2 min read読了の目安(約1900字

はじめに

スライスについて、手元で検証していなかったので理解を深めるために検証コードを書きました。

スライスについての理解

  • 配列とは違う
  • 配列を参照する
  • 組み込み関数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]

https://play.golang.org/p/2HwUtB6C7_1