Go のスライスは、必要に応じて自動的にサイズ変更される動的配列です。ただし、保持できる要素の最大数を示す容量は、通常は変更されません。これにより、Go がスライス内の要素の数を減らした後にこの容量を縮小する方法を提供しているかどうかという疑問が生じる可能性があります。
提供されたコード スニペットでは、スライス a が初期化され、1,000 万の整数が設定されています。目標は、そのサイズを要素数をわずか 10 個に減らすことです。スライスや削除などの従来の方法では、スライスの容量は変更されません。
スライス容量の縮小
Go は、「realloc」操作を効果的に実現する方法を提供します。
a = append([]int64(nil), a[:newSize]...)
このコードは、新しい空のスライスを作成し、最初の newSize 要素を to に追加します。 それ。新しいスライスの容量は newSize と同じになります。
考慮事項
この操作には、基になる配列のコピーが含まれる場合があることに注意することが重要です。 Go コンパイラーは、最適化に基づいて、インプレース サイズ変更を実行するかコピーを実行するかを決定します。
また、このアプローチは通常、マイクロ最適化です。メモリ消費の問題は、スライス容量の縮小だけに依存するのではなく、アルゴリズムとデータ構造を慎重に選択することで対処する必要があります。
制限事項
提供されたコード スニペットは部分的に正しいです。コンパイラーは、他のポインターがスライスのバッキング配列を参照しているかどうかを常に判断できるわけではありません。したがって、操作によりコピーが実行されることが保証されます。この制限は、将来の Go リリースで解決される可能性があります。
以上がGo スライスを縮小できます: スライスの容量を減らす方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。