Go言語のappend()は要素をスライスに追加します

Go言語のappend()は要素をスライスに追加します

 
 
Go 言語の組み込み関数 append() は要素をスライスに動的に追加できます。コードは次のとおりです。

 

 var a []int
a = append(a, 1) // 1つ要素を追加
a = append(a, 1, 2, 3) // 複数の要素を追加する、手動で展開する方法
a = append(a, []int{1,2,3}...) // スライスを追加する、スライスを展開する必要があります。 

ただし、append() 関数を使用して要素をスライスに動的に追加する場合、スペースが十分な要素を収容するのに十分でない場合、スライスは「拡張」され、新しいスライスの長さが変更されることに注意してください。 。

スライスを拡張する場合、容量の拡張ルールは、1、2、4、8、16… のように容量の倍数に従って拡張することです。コードは次のとおりです。


for i := 0; i < 10; i++ {
numbers = append(numbers, i)
fmt.Printf("len: %d cap: %d pointer: %p\n", len(numbers), cap(numbers), numbers)
}

コード出力は次のとおりです。

len: 1  cap: 1 pointer: 0xc0420080e8
len: 2  cap: 2 pointer: 0xc042008150
len: 3  cap: 4 pointer: 0xc04200e320
len: 4  cap: 4 pointer: 0xc04200e320
len: 5  cap: 8 pointer: 0xc04200c200
len: 6  cap: 8 pointer: 0xc04200c200
len: 7  cap: 8 pointer: 0xc04200c200
len: 8  cap: 8 pointer: 0xc04200c200
len: 9  cap: 16 pointer: 0xc042074000
len: 10  cap: 16 pointer: 0xc042074000

コードの説明は次のとおりです。

  • 行 1 は整数スライスを宣言します。
  • 行 4 は、数値スライスに 10 個の数値を追加するループです。
  • 5 行目では、スライスの長さ、容量、ポインターの変更を出力し、関数 len() を使用してスライスの要素数を表示し、関数 cap() を使用してスライスの容量を表示します。

コード出力を見ると、スライス長 len がスライス容量の上限と等しくないという興味深いルールが見つかります。

スライスに要素を継続的に追加していくプロセスは、会社の移転に似ています。会社の発展の初期段階では、資金が厳しく、人員も少ないため、従業員全員を収容するには小さな部屋しか必要としません。事業の拡大と収入の増加のためにワークステーションを拡張する必要があるが、オフィスの規模は固定されており変更できないため、会社は移転することしか選択できず、移転するたびに全員が異動する必要がある新しいオフィス。

  • 従業員とワークステーションはスライス内の要素です。
  • オフィスは割り当てられたメモリです。
  • 移動とはメモリを再割り当てすることです。
  • 何度移動しても会社名は変わりませんし、外部で使用するスライスを表す変数名も変更されません。
  • 移動後はアドレスが変わるため、メモリの「アドレス」も変更されます。

スライスの末尾に追加するだけでなく、スライスの先頭に要素を追加することもできます。

var a = []int{1,2,3}
a = append([]int{0}, a...) // 先頭に1個要素を追加する
a = append([]int{-3,-2,-1}, a...) // 先頭に1つのスライスを追加する 

スライスの先頭に要素を追加すると、一般にメモリの再割り当てが発生し、既存のすべての要素が一度コピーされることになるため、スライスの先頭から要素を追加するパフォーマンスは、スライスの先頭から要素を追加するパフォーマンスよりもはるかに劣ります。終わり。

append 関数は新しいスライスのプロパティを返すため、スライスはチェーン操作もサポートしており、複数の追加操作を組み合わせてスライスの中央に要素を挿入できます。

var a []int
a = append(a[:i], append([]int{x}, a[i:]...)...) // xをi番目の位置に挿入する
a = append(a[:i], append([]int{1,2,3}, a[i:]...)...) // スライスをi番目の位置に挿入する 

各追加の 2 番目の追加呼び出しでは、一時スライスを作成し、a[i:] の内容を新しく作成したスライスにコピーしてから、一時的に作成したスライスを a[:i] に追加します。

 

「 Go言語のappend()は要素をスライスに追加します」についてわかりやすく解説!絶対に観るべきベスト2動画

Golang|append
【初心者必見!】Go言語とは?できることや学ぶメリット・将来性について解説