Go でスライスを実際にクリアし、そのメモリを取り戻すにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-19 14:36:03
オリジナル
589 人が閲覧しました

How do I truly clear a slice in Go and reclaim its memory?

Go でのスライスのクリア

提供されたコード スニペットは、スライスの長さを 0 に設定してスライスを「クリア」する 1 つのアプローチを示しています。

package main

import "fmt"

func main() {
    letters := []string{"a", "b", "c", "d"}
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
    // clear the slice
    letters = letters[:0]
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
}
ログイン後にコピー

このアプローチはスライスの内容をクリアしているように見えますが、スライスに関連付けられた基礎となるメモリをガベージ コレクターに解放するわけではありません。スライスを実際にクリアしてメモリを再利用するには、スライスを nil に設定するのがベスト プラクティスです。

package main

import "fmt"

func main() {
    letters := []string{"a", "b", "c", "d"}
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
    // clear the slice
    letters = nil
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
}
ログイン後にコピー

スライスを nil に設定すると、いくつかの利点があります。

  • 基礎となるメモリはガベージ コレクターに解放されます。
  • スライスは、容量も長さもゼロの空のスライスとして動作します。
  • 元のスライスへのエイリアスはポイントされなくなります。

スライスの容量をゼロに変更しても、スライスがクリアされたり、基礎となるメモリが解放されたりするわけではないことに注意することが重要です。ただし、スライスを nil に設定すると、割り当てられたメモリがすべて削除され、スライスが初期状態にリセットされます。

以上がGo でスライスを実際にクリアし、そのメモリを取り戻すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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