Go のスライスの最大長
Go のスライスは、動的にサイズ変更される、柔軟な配列のビューです。これは、基礎となる配列の連続したセグメントを表します。
Go のドキュメントによると、スライスのインデックスは整数で管理されます。したがって、スライスの最大容量は、ターゲット ビルドのデフォルトの整数のサイズによって制限されます。
ただし、この理論上の制限は、メモリの制約により常に達成できるとは限りません。使用可能なメモリよりも大きいサイズのスライスを作成しようとすると、エラーが発生します。これは、スライス要素のサイズがゼロ以外の場合は「致命的エラー: ランタイム: メモリ不足」、スライス要素のサイズがゼロの場合は「パニック: ランタイム エラー: Makeslice: len out of range」として現れる可能性があります。 .
表示される具体的なエラー メッセージは、スライス要素のサイズがゼロかどうかによって異なります。要素サイズがゼロの場合、スライス サイズが最大許容サイズを超えているため、「makeslice: len out of range」エラーが発生します。要素サイズがゼロ以外の場合、割り当てが利用可能なメモリを超えるため、「致命的エラー: ランタイム: メモリ不足」エラーが発生します。
最大スライス サイズを説明するために、次の例を考えてみましょう。 4Gb マシン上の 64 ビット Linux OS のブール スライス:
package main import ( "fmt" "math" ) func main() { r := make([]bool, math.MaxInt32) fmt.Println("Size: ", len(r)) }
このコードを実行すると、次のように出力されます:
Size: 2147483647
これは、ブール要素の最大スライス サイズが int32 の最大値であることを示します。 64 ビット システム。要素タイプをより広い範囲を持つ uint32 に変更すると、メモリ割り当てが利用可能な RAM を超えるため、「致命的エラー: ランタイム: メモリ不足」が発生します。
興味深いことに、数学を使用すると、 int64 データ型の最大値を表す .MaxInt64 を使用すると、「パニック: ランタイム エラー: Makeslice: len が範囲外です」エラーが発生します。これは、スライス サイズがこのデータ型の許容制限を超えているためです。
これらの制限はターゲットのビルドとメモリの制約に基づいていることに注意することが重要です。 struct{} などのサイズがゼロの要素を割り当てる場合、次の例に示すように、最大スライス サイズがはるかに大きくなる可能性があります:
package main import ( "fmt" "math" ) func main() { r := make([]struct{}, math.MaxInt64) fmt.Println("Size: ", len(r)) }
このコードは次のように出力します:
Size: 9223372036854775807
結論として、Go のスライスの最大長は、ターゲットのビルド、メモリ制約、およびスライス要素。ほとんどの実用的な目的では、デフォルトの整数のサイズによって課される制限で十分です。ただし、非常に大きなサイズのスライスを作成する必要がある場合は、メモリ使用量と潜在的なエラーの影響を考慮することが重要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3