Go言語のSliceもよく使うタイプです。
Arrayと似ているのですが、Array型ではないです。
中ではArrayを使っています。可変長の配列Arrayの場合はSlice型でよいでしょう
Slice定義方法
例:
var slice1 []int
fmt.Println(slice1)
出力:
[]
配列から抽出してSlice生成
配列変数名[開始index:終了index]
開始indexと終了indexは省略可能です。
また終了indexの要素は含まないです。
開始indexがない場合は、[0:終了index]と同じで、最初から終了indexまで
終了indexがない場合は、[開始index:配列長さ]と同じで、開始indexから最後まで
例1:
var months = [12]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
var slice1 = months[4:10]
fmt.Println(slice1)
出力:
[5 6 7 8 9 10]
例2:
var months = [12]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
var slice1 = months[:]
fmt.Println(slice1)
出力:
[1 2 3 4 5 6 7 8 9 10 11 12]
例3:
var months = [12]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
var slice1 = months[:6]
fmt.Println(slice1)
出力:
[1 2 3 4 5 6]
例4:
var months = [12]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
var slice1 = months[6:]
fmt.Println(slice1)
出力:
[7 8 9 10 11 12]
make関数で生成
var 変数名 = make([]T, length, capacity)
例:
var slice1 = make([]int, 10, 20)
fmt.Println(slice1)
出力:
[0 0 0 0 0 0 0 0 0 0]
Sliceメソッド
長さ:len(変数名)
例:
var slice1 = make([]int, 10, 20)
fmt.Println(len(slice1))
出力:
10
容量:cap(変数名)
例:
var slice1 = make([]int, 10, 20)
fmt.Println(cap(slice1))
出力:
20
Reslice
例:
var slice1 = make([]int, 10, 20)
var slice2 = slice1[8:10]
fmt.Println(slice2)
fmt.Println("len:", len(slice2))
fmt.Println("cap:", cap(slice2))
出力:
[0 0]
len: 2
cap: 12
特に容量は、元Sliceの最後までの数です。
slice2は、8~20までの数は12です。
Append:要素追加
例1:
var slice1 = make([]int, 10, 20)
slice1 = append(slice1, 11, 22, 33)
fmt.Println(slice1)
fmt.Println("len:", len(slice1))
fmt.Println("cap:", cap(slice1))
fmt.Printf("address:%p\n", slice1)
出力:
[0 0 0 0 0 0 0 0 0 0 11 22 33]
len: 13
cap: 20
address:0xc000092000
容量は変わっていないです。
例2:
var slice1 = make([]int, 10, 20)
slice1 = append(slice1, 11, 22, 33, 44, 55, 66, 77, 88, 99, 100, 111)
fmt.Println(slice1)
fmt.Println("len:", len(slice1))
fmt.Println("cap:", cap(slice1))
fmt.Printf("address:%p\n", slice1)
出力:
[0 0 0 0 0 0 0 0 0 0 11 22 33 44 55 66 77 88 99 100 111]
len: 21
cap: 40
address:0xc00007e000
容量は変わると、メモリアドレスも変わります。
copy:copy(コピー先, コピー元)
copy(toSlice, fromSlice)
例:
var slice1 = []int{1, 2, 3, 4, 5}
var slice2 = []int{6, 7, 8}
copy(slice1, slice2)
fmt.Println("slice1:", slice1)
fmt.Println("slice2:", slice2)
var slice3 = []int{1, 2, 3, 4, 5}
var slice4 = []int{6, 7, 8}
copy(slice4, slice3)
fmt.Println("slice3:", slice3)
fmt.Println("slice4:", slice4)
出力:
slice1: [6 7 8 4 5]
slice2: [6 7 8]
slice3: [1 2 3 4 5]
slice4: [1 2 3]
copy関数はsliceの長さは変更しないです。コピー先に長さまでコピーします。
以上