実装
s4 := make([]int, 0, 4)
fmt.Println(s4, len(s4), cap(s4))
s5 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9)
fmt.Println(s5, len(s5), cap(s5))
//[] 0 4
//[1 2 3 4 5 6 7 8 9] 9 10
上記の実装をしたときにs5の容量は初期に設定した以上の要素数を追加しようとしています。そのときにGo言語は、自動的により大きな容量を持つスライスを作成します。今回であれば、最初の1-4までの要素は初期値の容量で入れることができます。しかし、残りの5-9は一度、初期容量の倍の数スライス容量を増やします。それでも足りませんので、Go言語は2のべき条の数容量を追加します。よって、上記の例では倍数容量を追加したときに8となりますが、まだ足りないので、さらに2のべき条ずつ容量を追加します。今回は2だけで足りますので最終的8+2
で10となります。
よって、次の実装も下記のような結果になります。
s76 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
fmt.Println(s76, len(s76), cap(s76))
// [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] 15 16