🌊

Golang スライス

2021/07/13に公開

概要

  • スライスは配列が基盤となっている
  • スライスのサイズは固定ではなく動的
  • スライスのコンポーネント
    • 基になる配列の最初の到達可能な要素へのポインター
    • スライス内の要素数
    • スライスの始めから、基になる配列の終わりまでの要素数

スライスの宣言と初期化

names := []string{"foo", "bar", "baz"}
fmt.Println(names)
fmt.Println("Length:", len(names))
fmt.Println("Capacity:", cap(names))

項目のスライス

スライス演算子

s[i:p]
  • i: 基になる配列の最初の要素へのポインター
    • 省略可能。省略した場合は最初の位置が入る
  • p: 新しいスライスで使用できる、基になる配列の最後の要素

foo := []string{"A1", "B2", "C3", "D4" ,"E5", "F6", "G7", "H8"}
quarter1 := foo[0:2]
quarter2 := foo[2:4]
quarter3 := foo[4:6]
quarter4 := foo[6:8]
fmt.Println(quarter1, len(quarter1), cap(quarter1))
fmt.Println(quarter2, len(quarter2), cap(quarter2))
fmt.Println(quarter3, len(quarter3), cap(quarter3))
fmt.Println(quarter4, len(quarter4), cap(quarter4)))

出力

[A1 B2] 2 8
[C3 D4] 2 6
[E5 F6] 2 4
[G7 H8] 2 2

スライスの容量によって示されるのは、スライスをどこまで拡張できるか

項目の追加

slice = append(slice, element)
  • それより多くの要素を保持するだけの十分な容量がスライスにない場合、Go によってその容量が 2 倍にされる

項目の削除

  • スライスから要素を削除する為の組み込み関数はない
  • スライス演算子 s[i:p]で必要な要素のスライスを作成する
foo := []string{"A1", "B2", "C3"}
remove := 1
fmt.Println("Before", foo)
foo = append(foo[:remove], foo[remove+1:]...)
fmt.Println("After", foo)

出力

Before [A1 B2 C3]
After [A1 C3]

スライスのコピー

  • スライスの要素を変更すると、基になる配列も変更される
  • 同じ基になる配列を参照している他のすべてのスライスが影響を受ける
  • コピーでは新しい基になる配列が作成され、他に影響を与えなくなる
slice2 := make([]string, 3)
copy(slice2, foo[1:4])
GitHubで編集を提案

Discussion