Go でスライスを効果的にクリアし、その基礎となるメモリを解放するにはどうすればよいでしょうか?

Barbara Streisand
リリース: 2024-11-21 05:36:11
オリジナル
550 人が閲覧しました

How do you effectively clear a slice in Go and release its underlying memory?

Go でのスライスのクリア

この記事では、Go でスライスをクリアするための最適なアプローチについて説明します。最初に提案された解決策は、スライスを独自のバッファーの空の範囲に設定することでスライスをクリアしようとしました。このアプローチは論理的であるように見えますが、スライスに関連付けられた基礎となるメモリは解放されません。

推奨される解決策は、単純にスライスを nil に設定することです。 Go の nil スライスは正常に動作する特性を示し、スライスを nil に割り当てると、基礎となるメモリがガベージ コレクターに解放されます。このアプローチは、最初の提案の制限を受けることなく、スライスを効果的にクリアします。

この方法の有効性を説明するために、次のコード サンプルを検討してください。

package main

import (
    "fmt"
)

func dump(letters []string) {
    fmt.Println("letters = ", letters)
    fmt.Println(cap(letters))
    fmt.Println(len(letters))
    for i := range letters {
        fmt.Println(i, letters[i])
    }
}

func main() {
    letters := []string{"a", "b", "c", "d"}
    dump(letters)
    // clear the slice
    letters = nil
    dump(letters)
    // add stuff back to it
    letters = append(letters, "e")
    dump(letters)
}
ログイン後にコピー

出力:

letters =  [a b c d]
4
4
0 a
1 b
2 c
3 d
letters =  []
0
0
letters =  [e]
1
1
0 e
ログイン後にコピー

示されているように、スライスを nil に設定すると、その容量を含むその内容がクリアされます。これにより、以前の操作からのデータが残ることなく、スライスを効率的に再利用できます。

以上がGo でスライスを効果的にクリアし、その基礎となるメモリを解放するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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