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

Go 未分類

でいず~
でいず~

Goの容量という考え方とappendの動きについてまとめてみたよん

容量と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すれば追加元の配列に要素が追加されるわけではなく、容量が足りなければ新しい配列を作り直してしまいます。

なので、要素を上書きするときなどの挙動に気をつけないといけないですね。

無駄のない努力で楽しいエンジニアライフを♪

ではまた~