ホームページ > バックエンド開発 > Golang > Go の `append()` 関数は値で渡されたときにスライスの動作にどのような影響を与えますか?

Go の `append()` 関数は値で渡されたときにスライスの動作にどのような影響を与えますか?

DDD
リリース: 2024-11-20 15:14:15
オリジナル
902 人が閲覧しました

How Does Go's `append()` Function Affect Slice Behavior When Passed by Value?

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

Go でスライスを操作する場合、append() 関数がどのようにスライスと対話するかを理解することが重要です。値によって渡されるスライス。

次のコードを考えてみましょう。スニペット:

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

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

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}
ログイン後にコピー

この例では、2 つのスライス (スライスとスライス 1) が作成され、スライス 1 は最初にスライスと同じ配列を指します。ただし、最初の append() 呼び出しの後、slice1 には別の配列を指す新しいスライス値が割り当てられます。この割り当てにより、slice1 の動作はスライスから独立します。

説明:

  • 値による受け渡し: Go では、すべてが渡されます。値による。つまり、slice1 はスライスのスライスのコピーを受け取ります。 header.
  • 容量付き追加: (この場合のように) 長さに等しい容量を持つスライスに 0 個以上の要素を追加する場合、より大きな新しい配列が割り当てられます。
  • スライス ヘッダーの割り当て: append() 呼び出しは、新しい配列を指す新しいスライス ヘッダーを返します。スライス 1.
  • 独立したスライス: 代入後、スライスとスライス 1 は異なるスライス ヘッダーを指す 2 つの異なる変数になり、したがって異なるものになります。 arrays.

結果:

  • 不変性: 1 つのスライス (スライス 1 など) 内の要素に加えられた変更は無効になります。他のスライスに反映されます (例:
  • メモリ管理: 追加操作はメモリの再割り当てにつながり、新しい配列が作成され、パフォーマンスに影響を与える可能性があります。

スライス ヘッダーとその内部構造を理解するには、次のリソースを参照してください:

  • [Golang スライスは通過しますか?]値?](https://stackoverflow.com/questions/25740338/are-golang-slices-pass-by-value)
  • [Go スライス: 使用法と内部](https://blog.golang .org/slices)

以上がGo の `append()` 関数は値で渡されたときにスライスの動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート