【GO日記】容量とappendまとめ

でいず~
Goの容量という考え方とappendの動きについてまとめてみたよん
容量とappend
バッファが一杯になるとチャネルへの送信がブロックされる
バッファ内に値がなくてもブロックされる
新しい要素を配列の最後にコピーする
容量が足りない場合
元の約2倍の容量の配列を確保する
新しい要素を配列の最後にコピーする

でいず~
実際コードでappendの動きを確認してみよう♪
package main
import (
"fmt"
)
func main() {
a := []int{100, 200}
// 出力結果 => a:[100 200] cap(a): 2(容量)
fmt.Println(a, cap(a))
// 容量が足りない場合
// 配列を作り直す(aとは別物)
b := append(a, 300)
// bには反映されない(aには反映される)
a[0] = 10
// 出力結果 => b: [100 200 300], cap(b): 4
fmt.Println(b, cap(b))
// 容量が足りる場合
// bの配列にそのまま要素を追加
c := append(b, 400)
b[1] = 2
// 出力結果 => b: [100 2 300 400], cap(b): 4
fmt.Println(c, cap(c))
まとめ
今までPythonを扱っていたので「容量」という考え方を初めて聞きました。
配列に要素を追加したいとき、ひたすらappendすれば追加元の配列に要素が追加されるわけではなく、容量が足りなければ新しい配列を作り直してしまいます。
なので、要素を上書きするときなどの挙動に気をつけないといけないですね。
無駄のない努力で楽しいエンジニアライフを♪
ではまた~