GoにおけるSliceのコピーをする方法
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
- 効率的なスライスの複製には、組み込みの
copy
関数を使用します。 append
も新しいスライスのコピーを作成するために使用できます。- 参照型を扱う場合は、シャローコピーとディープコピーに注意してください。
Goでは、スライスは基になる配列への参照であるため、コピーは微妙な作業になります。Goでスライスを効果的にコピーする方法を次に示します。
copy
関数の使用
Goには、スライスを複製するための組み込みのcopy
関数が用意されています。この関数は、ソーススライスからデスティネーションスライスに要素をコピーします。使用方法は次のとおりです。
package main import "fmt" func main() { // 元のスライス original := []int{1, 2, 3, 4, 5} // 元と同じ長さの新しいスライスを作成 copySlice := make([]int, len(original)) // 元のスライスから新しいスライスに要素をコピー copy(copySlice, original) // コピーされたスライスを表示 fmt.Println(copySlice) // Output: [1 2 3 4 5] }
この例では:
- 整数を含む
original
スライスを定義します。 make
関数を使用して、original
と同じ長さでcopySlice
を作成します。copy
関数は、original
からcopySlice
に要素を複製します。
スライスの部分的なコピー
必要な範囲を指定して、スライスのサブセットをコピーすることもできます。
package main import "fmt" func main() { // 元のスライス original := []int{1, 2, 3, 4, 5} // 元の一部の要素を保持するための新しいスライスを作成 copySlice := make([]int, 3) // 元のスライスのサブセットをコピー copy(copySlice, original[1:4]) // コピーされたスライスを表示 fmt.Println(copySlice) // Output: [2 3 4] }
ここでは、original
スライスのインデックス1から3(インデックス4を除く)までの要素をcopySlice
にコピーします。
Appendを使用したスライスのコピー
または、append
関数を使用してスライスのコピーを作成することもできます。
package main import "fmt" func main() { // 元のスライス original := []int{1, 2, 3, 4, 5} // appendを使用してコピー copySlice := append([]int{}, original...) // コピーされたスライスを表示 fmt.Println(copySlice) // Output: [1 2 3 4 5] }
このアプローチでは:
- 空のスライス
[]int{}
を初期化します。 - 可変引数
original...
でappend
を使用して、original
のすべての要素を新しいスライスに追加します。
重要な考慮事項
-
ディープコピーとシャローコピー: 上記の方法はシャローコピーを実行します。つまり、スライス構造は複製しますが、スライスに参照(ポインタ、別のスライスなど)が含まれている場合、基になるデータは複製しません。ディープコピーの場合、参照されている各要素を手動でコピーする必要があります。
-
新しいスライスのキャパシティ:
make
を使用してデスティネーションスライスを作成する場合、そのキャパシティを指定することもできます。キャパシティが長さよりも大きい場合、新しいスライスは再割り当てなしで追加の要素を格納できます。
これらの方法を理解することで、Goプログラムでのスライスのコピーを効果的に管理できます。
FAQs
デスティネーションが保持できる要素数だけがコピーされます。
append
は独自のバッキング配列を持つ新しいスライスを作成しますが、copy
は事前に割り当てられたスライスが必要です。
いいえ、要素のみがコピーされます。新しいスライスを変更しても、元のスライスには影響しません。
Leapcellは、Goプロジェクトをホストするための最適な選択肢です。
Leapcellは、Webホスティング、非同期タスク、Redisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発できます。
無制限のプロジェクトを無料でデプロイ
- 使用量に応じてのみ料金が発生します — リクエストや料金は一切発生しません。
圧倒的なコスト効率
- アイドル状態の料金なしで、従量課金制。
- 例:25ドルで、平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者体験
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリクスとログ。
簡単なスケーラビリティと高いパフォーマンス
- 高い並行処理を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ