Go のスライス容量に関する悩み: サイズ変更とコピー
Go では、スライスは配列を動的かつ効率的に管理する方法を提供します。新しい要素が追加されるとその容量が増加する可能性があり、スライスにそれらを格納するのに十分なスペースが確保されます。ただし、要素が削除されたときにスライスの容量を縮小できるかどうかは必ずしも明確ではありません。
次のコードを考えてみましょう:
package main import ( "math" "fmt" ) func main() { var a []int64 var i int64 upto := int64(math.Pow10(7)) for i = 0; i < upto; i++ { a = append(a, i) } fmt.Println(cap(a)) }
このコードを実行すると、スライスの容量が期待できるかもしれません。いくつかの要素を削除するとさらに小さくなります。ただし、容量は変わりません。これは、Go のスライス実装がメモリ効率よりもパフォーマンスを優先しているためです。
容量を削減するには、必要な容量を持つ新しいスライスを作成し、関連する要素をコピーする必要があります:
a = append([]int64(nil), a[:newSize]...)
この操作はスライスの容量を効果的に縮小しますが、要素のコピーも必要となるため、大きなスライスの場合はコストがかかる可能性があります。
この制限が問題になるかどうかは状況によって異なります。特定のユースケースについて。メモリ消費が重大な懸念事項である場合は、上記の手法を使用してスライスの容量を手動で管理することが必要になる場合があります。ただし、ほとんどのアプリケーションでは、Go スライスの利便性とパフォーマンスの利点が、容量削減に関連する潜在的な欠点を上回ります。
以上がGo スライスの容量を縮小するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。