組み込み API ドキュメントとは異なり、append() 関数は常に新しいスライスを作成するとは限りません。これは、元のスライスの容量と追加される要素の数によって決まります。
ブール値の組み合わせが再帰的に作成される提供されたコード スニペットでは、感嘆符は、からチャネルに送信されるスライスを示します。 AddOption関数。ただし、main() の反対側に現れるスライスは変更されます。
スライスのデータ型とその内部表現の区別から混乱が生じます。スライス記述子は、2 つの整数 (長さと容量) と、基礎となるデータへのポインターで構成されます。したがって、append() は、新しい記述子を持つ新しいスライスを返しますが、データへのポインターは同じです。
これを次のコード サンプルで示します。
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
出力:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
これは、元のスライスにはまだ容量があるため、a と b の両方が同じデータ ポインターを共有していることを示しています。ただし、容量を 4 に減らすと:
<code class="go">s := make([]int, 0, 4)</code>
出力は次のようになります:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
元のスライスには十分な容量がなくなったため、append() は次のような新しいスライスを作成します。 b.
の新しいデータ ポインター以上がGolang の「append()」関数が新しいスライスを割り当てるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。