Go 速習チュートリアル

Go 言語のスライス

1. Goのスライス (Go Slices)

スライス(Slices)はアレイ(アレイ)に似ていますが、より強力で柔軟なデータ構造です。

アレイと同様に、スライスも一つのバリアブル(変数)に同じデータタイプ(型)の複数の値を保存するために使用されます。 しかし、アレイとは異なり、スライスのレングス(長さ)は必要に応じて増やしたり減らしたりすることができます。

Goにおいて、スライスを作成する方法はいくつかあります:

  • []datatype{values} フォーマットを使用する
  • アレイからスライスを作成する
  • make() ファンクション(関数)を使用する

2. []datatype{values} によるスライスの作成

構文(Syntax)

slice_name := []datatype{values}

スライスを宣言する一般的な方法は以下の通りです:

myslice := []int{}

上記のコードは、レングスが0、キャパシティ(容量)が0のエンプティ(空)なスライスを宣言します。

宣言時にスライスをイニシャライズ(初期化)する場合は、次のように記述します:

myslice := []int{1, 2, 3}

上記のコードは、レングス3、キャパシティ3のインテジャー(整数)型スライスを宣言します。

Goには、スライスのレングスとキャパシティを返す2つのファンクションがあります:

  • len() ファンクション - スライスのレングス(スライス内のエレメントの数)を返します。
  • cap() ファンクション - スライスのキャパシティ(スライスが拡張または縮小できるエレメントの数)を返します。

実装例:
この例では、[]datatype{values} フォーマットを使用してスライスを作成する方法を示しています。

package main
import ("fmt")

func main() {
  myslice1 := []int{}
  fmt.Println(len(myslice1))
  fmt.Println(cap(myslice1))
  fmt.Println(myslice1)

  myslice2 := []string{"Go", "スライスは", "とても", "強力です"}
  fmt.Println(len(myslice2))
  fmt.Println(cap(myslice2))
  fmt.Println(myslice2)
}

実行結果:

0
0
[]
4
4
[Go スライスは とても 強力です]

上記の例では、最初のスライス(myslice1)に具体的なエレメントが指定されていないため、レングスとキャパシティの両方がゼロになります。2番目のスライス(myslice2)では、エレメントが指定されており、レングスとキャパシティは指定されたエレメント数と等しくなります。

3. アレイからスライスを作成

アレイの一部を切り出す(スライシング)ことで、スライスを作成できます。

構文(Syntax)

var myarray = [length]datatype{values} // アレイ
myslice := myarray[start:end]         // アレイから作成されたスライス

実装例:
アレイからスライスを作成する例です。

package main
import ("fmt")

func main() {
  arr1 := [6]int{10, 11, 12, 13, 14, 15}
  myslice := arr1[2:4]

  fmt.Printf("myslice = %v\n", myslice)
  fmt.Printf("レングス = %d\n", len(myslice))
  fmt.Printf("キャパシティ = %d\n", cap(myslice))
}

実行結果:

myslice = [12 13]
レングス = 2
キャパシティ = 4

上記の例において、myslice はレングス2のスライスです。これはレングス6のアレイ arr1 から作成されています。

スライスは、バリューが12であるアレイの3番目のエレメントから始まります(アレイのインデックスは0から始まるため、[0] が最初のエレメント、[1] が2番目となります)。このスライスはアレイの最後まで拡張可能です。そのため、スライスのキャパシティは 4 となります。

もし myslice がインデックス0から始まっていた場合、スライスのキャパシティは6になっていたはずです。

4. make() 関数を使ったスライスの作成

make() ファンクションを使用してスライスを作成することも可能です。

構文(Syntax)

slice_name := make([]type, length, capacity)

       注意: キャパシティのパラメータが定義されていない場合、レングスと同じ値になります。

実装例:

make() ファンクションを使用してスライスを作成する例です。

package main
import ("fmt")

func main() {
  myslice1 := make([]int, 5, 10)
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("レングス = %d\n", len(myslice1))
  fmt.Printf("キャパシティ = %d\n", cap(myslice1))

  // キャパシティを省略した場合
  myslice2 := make([]int, 5)
  fmt.Printf("myslice2 = %v\n", myslice2)
  fmt.Printf("レングス = %d\n", len(myslice2))
  fmt.Printf("キャパシティ = %d\n", cap(myslice2))
}

実行結果:

myslice1 = [0 0 0 0 0]
レングス = 5
キャパシティ = 10
myslice2 = [0 0 0 0 0]
レングス = 5
キャパシティ = 5