ホームページ >バックエンド開発 >Golang >append() は Go のスライスにどのように影響しますか?

append() は Go のスライスにどのように影響しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-15 13:54:02713ブラウズ

How Does append() Affect Slices in Go?

スライスに対する append() の動作を理解する

スライスをポインターとして初期想定しているにもかかわらず、提供されたコードは、追加が() 操作は、元のスライスに直接影響しません。これは、Go ではスライスを含め、すべてが値によって渡されるためです。したがって、スライスを関数に渡すか、新しい変数に割り当てるときは、スライス ヘッダーのコピーを渡すだけです。

スライス ヘッダーには、スライスの長さ、その容量、そして基礎となる配列へのポインタ。 append() 操作がスライスに対して実行されると、新しい要素を収容するために必要に応じて新しい配列が割り当てられます。次に、スライス ヘッダーが新しい配列を指すように更新され、新しい要素がコピーされます。この新しいスライス ヘッダーは、append() 呼び出しの結果として返されます。

コード例では、append() 操作の戻り値をスライス 1 変数に割り当てます。これは、slice1 がスライスとは異なる配列を指すことを意味します。スライス 1 の要素に加えられた変更はスライスには反映されず、その逆も同様です。

スライスとスライス 1 の両方が同じ配列を参照する動作を実現するには、スライスへのポインターを使用する必要があります。スライス自体の代わりに。例:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slicePtr := &slice
    slice1 := *slicePtr
    slice1[0] = 10000
    fmt.Println(slice)

    *slicePtr = append(*slicePtr, 100)
    (*slicePtr)[0] = 20000

    fmt.Println(slice)
}

この例では、slice とスライス 1 の両方が同じ基になる配列を指しているため、一方に加えられた変更はもう一方にも表示されます。

以上がappend() は Go のスライスにどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。