2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go言語のSlice

Last updated at Posted at 2019-03-02

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の長さは変更しないです。コピー先に長さまでコピーします。

以上

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?