Go でのスライスの最大長
この質問では、Go で作成できるスライスの最大サイズと、その要因について説明します。
Go では、スライスは順序付けられた値のコレクションを保存するために使用されます。スライスの長さは、スライスに含まれる要素の数を指し、その容量は、追加のメモリを割り当てる必要なしに保持できる要素の最大数を指します。
型 int は、スライスのサイズを決定します。行く。ターゲットのビルドに応じて、int のサイズは 32 ビットまたは 64 ビットになります。これは、スライスの最大容量がターゲット ビルドのデフォルトの整数のサイズによって決定されることを意味します。
整数サイズで許可される最大容量を超えるサイズのスライスを作成しようとすると、異なる条件によっては、エラー メッセージが発生する可能性があります。
たとえば、64 ビット Linux OS の場合メモリが 4GB の場合、次のスライスの作成は「致命的エラー: ランタイム: メモリ不足」で失敗します:
r := make([]bool, math.MaxUint32)
一方、次のスライスの作成は「パニック: ランタイム エラー: makelice: len out of」で失敗します。 range":
r := make([]bool, math.MaxInt64)
これは、 math.MaxUint32 が 32 ビットの符号なし整数であるためです。 math.MaxInt64 は 64 ビットの符号付き整数です。 Go ランタイムは安全性チェックを実行して、スライスのサイズがインデックス タイプで許可されている最大値を超えていないことを確認します。
興味深いことに、struct{} などのスライス要素タイプのサイズが 0 の場合、 math.MaxInt64:
r := make([]struct{}, math.MaxInt64)
のサイズのスライスを作成することが可能です。これは、サイズがゼロの要素型はメモリを必要とせず、実行時チェックが行われるためです。メモリ割り当てはトリガーされません。
要約すると、Go のスライスの最大サイズは、スライスのインデックスに使用される型のサイズによって決まります。サイズがゼロ以外の要素タイプのスライスの場合、最大サイズは利用可能な物理メモリによって制限されますが、サイズがゼロの要素タイプのスライスの場合、最大サイズはインデックス タイプのサイズによってのみ制限されます。
以上がGo スライスの最大サイズは何によって決まりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。