はじめに
A Tour of Goについて勉強になった箇所をまとめる。
長さと容量
長さ:スライスが現在持っている要素の数
容量:スライスが背後で確保している配列のサイズ
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Slice the slice to give it zero length.
s = s[:0]
printSlice(s)
// Extend its length.
s = s[:4]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
// len=6 cap=6 [2 3 5 7 11 13]
// len=0 cap=6 []
// len=4 cap=6 [2 3 5 7]
// len=2 cap=4 [5 7]
容量を指定しない場合
要素の追加によって長さが容量を超えたとき、新しくより大きな容量を持つ配列を確保し、既存の要素を新しい配列にコピーした後、新しい要素を追加する。
このプロセスが自動的に行われるため、容量の管理を意識する必要がない。
容量を指定する場合
容量は要素が追加されるたびに倍増する。これにより、大量の要素を追加する際のメモリ再割り当ての回数を減らし、パフォーマンスを向上させることができる。
ゼロ値
スライスのゼロ値はnil
。
nil
スライスは長さと容量は0
package main
import "fmt"
func main() {
var s []int
fmt.Println(s, len(s), cap(s))
if s == nil {
fmt.Println("nil!")
}
}
// [] 0 0
// nil!