Go-slice

提供:Dev Guides
移動先:案内検索

移動-スライス

Go Sliceは、Go Arrayを抽象化したものです。 Go配列を使用すると、同じ種類の複数のデータ項目を保持できる変数を定義できますが、サイズを動的に増加したり、独自のサブ配列を取得したりする組み込みメソッドは提供されません。 スライスはこの制限を克服します。 Arrayに必要な多くのユーティリティ関数を提供し、Goプログラミングで広く使用されています。

スライスを定義する

スライスを定義するには、サイズを指定せずにスライスを配列として宣言できます。 または、 make 関数を使用してスライスを作成できます。

var numbers []int/*a slice of unspecified size*/
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5)/* a slice of length 5 and capacity 5*/

len()およびcap()関数

スライスは配列の抽象化です。 実際には、基礎となる構造として配列を使用します。 * len()関数は、スライスに存在する要素を返します。 cap()*関数は、スライスの容量(つまり、収容できる要素の数)を返します。 次の例では、スライスの使用方法を説明します-

package main

import "fmt"

func main() {
   var numbers = make([]int,3,5)
   printSlice(numbers)
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

len = 3 cap = 5 slice = [0 0 0]

スライスなし

スライスが入力なしで宣言されている場合、デフォルトでは、nilとして初期化されます。 その長さと容量はゼロです。 たとえば-

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)

   if(numbers == nil){
      fmt.Printf("slice is nil")
   }
}
func printSlice(x []int){
   fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

len = 0 cap = 0 slice = []
slice is nil

サブスライス

スライスでは、* [lower-bound:upper-bound] *を使用してサブスライスを取得するために、下限と上限を指定できます。 たとえば-

package main

import "fmt"

func main() {
  /*create a slice*/
   numbers := []int{0,1,2,3,4,5,6,7,8}
   printSlice(numbers)

  /*print the original slice*/
   fmt.Println("numbers ==", numbers)

  /* print the sub slice starting from index 1(included) to index 4(excluded)*/
   fmt.Println("numbers[1:4] ==", numbers[1:4])

  /* missing lower bound implies 0*/
   fmt.Println("numbers[:3] ==", numbers[:3])

  /* missing upper bound implies len(s)*/
   fmt.Println("numbers[4:] ==", numbers[4:])

   numbers1 := make([]int,0,5)
   printSlice(numbers1)

  /*print the sub slice starting from index 0(included) to index 2(excluded)*/
   number2 := numbers[:2]
   printSlice(number2)

  /*print the sub slice starting from index 2(included) to index 5(excluded)*/
   number3 := numbers[2:5]
   printSlice(number3)

}
func printSlice(x []int){
   fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

len = 9 cap = 9 slice = [0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len = 0 cap = 5 slice = []
len = 2 cap = 9  slice = [0 1]
len = 3 cap = 7 slice = [2 3 4]

append()およびcopy()関数

  • append()*関数を使用して、スライスの容量を増やすことができます。 copy()関数を使用すると、ソーススライスの内容が宛先スライスにコピーされます。 たとえば-
package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)

  /*append allows nil slice*/
   numbers = append(numbers, 0)
   printSlice(numbers)

  /* add one element to slice*/
   numbers = append(numbers, 1)
   printSlice(numbers)

  /* add more than one element at a time*/
   numbers = append(numbers, 2,3,4)
   printSlice(numbers)

  /* create a slice numbers1 with double the capacity of earlier slice*/
   numbers1 := make([]int, len(numbers), (cap(numbers))*2)

  /*copy content of numbers to numbers1*/
   copy(numbers1,numbers)
   printSlice(numbers1)
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

len = 0 cap = 0 slice = []
len = 1 cap = 2 slice = [0]
len = 2 cap = 2 slice = [0 1]
len = 5 cap = 8 slice = [0 1 2 3 4]
len = 5 cap = 16 slice = [0 1 2 3 4]