Golang の「append()」関数が新しいスライスを割り当てるのはいつですか?

Patricia Arquette
リリース: 2024-11-02 03:27:30
オリジナル
168 人が閲覧しました

When Does Golang's `append()` Function Allocate a New Slice?

Golang Append() は新しいスライスを作成するのはいつですか?

組み込み 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!