Goで`range`を`foreach`として使う方法
Grace Collins
Solutions Engineer · Leapcell

Key Takeaways
- Goは、配列、スライス、マップ、文字列、チャネルを反復処理するために
range
キーワードを使用します。 - Goには従来の
foreach
はありませんが、range
は慣用的な方法で同じ目的を果たします。 - より動的なシナリオのために、リフレクションを使用してカスタム
foreach
関数を構築できます。
Goには、他の言語のような組み込みのforeach
ループはありません。ただし、Goは同様の目的を果たす強力なfor
ループをrange
キーワードとともに提供し、スライス、配列、マップ、文字列、チャネルなどのさまざまなデータ構造を反復処理できます。
スライスと配列の反復処理
スライスまたは配列でrange
を使用すると、各要素のインデックスと値の両方が返されます。
package main import "fmt" func main() { numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { fmt.Printf("Index: %d, Value: %d\n", index, value) } }
インデックスが必要ない場合は、ブランク識別子_
を使用して省略できます。
for _, value := range numbers { fmt.Println(value) }
マップの反復処理
マップでrange
を使用すると、キーと値のペアを反復処理できます。
fruits := map[string]string{ "a": "apple", "b": "banana", } for key, value := range fruits { fmt.Printf("%s -> %s\n", key, value) }
マップの反復順序は保証されず、反復ごとに異なる場合があることに注意してください。
文字列の反復処理
文字列を反復処理する場合、range
はその位置のインデックスとルーン(Unicodeコードポイント)を返します。
for index, char := range "GoLang" { fmt.Printf("Character at byte position %d: %c\n", index, char) }
このアプローチは、UTF-8エンコードされた文字列のマルチバイト文字を正しく処理します。
チャネルの反復処理
range
を使用して、チャネルが閉じられるまでチャネルから値を受信することもできます。
ch := make(chan int) go func() { for i := 0; i < 5; i++ { ch <- i } close(ch) }() for val := range ch { fmt.Println(val) }
このパターンは、チャネルが明示的に閉じられているかどうかを確認する必要なく、チャネルから読み取る場合に役立ちます。
カスタムforeach
の実装
Goのrange
はほとんどの反復ニーズをカバーしていますが、開発者はリフレクションを使用してカスタムforeach
関数を作成し、スライスの各要素に関数を適用しています。
func ForEach(slice interface{}, fn func(interface{})) { v := reflect.ValueOf(slice) for i := 0; i < v.Len(); i++ { fn(v.Index(i).Interface()) } }
このアプローチにより、型に関係なく、スライスの各要素に関数を適用できます。
結論
Goには従来のforeach
ループはありませんが、range
キーワードを使用したfor
ループは、さまざまなデータ構造を反復処理するための汎用的で効率的な方法を提供します。 range
を効果的に理解し、活用することで、クリーンで慣用的なGoコードを作成できます。
FAQs
いいえ、Goにはforeach
キーワードはありません。代わりに、range
を持つfor
を使用して同様の機能を実現します。
はい、range
はマップ(キーと値のペアを取得するため)およびチャネル(閉じられるまで値を受信するため)で機能します。
いいえ、マップの反復順序はランダム化されており、実行間で一貫していません。
Leapcellは、Goプロジェクトをホストするための最良の選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量のみを支払い — リクエストも料金も発生しません。
比類のないコスト効率
- アイドル料金なしの従量課金制。
- 例:25ドルで平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察を得るためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高パフォーマンス
- 高い同時実行性を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
ドキュメントで詳細をご覧ください。
Xでフォローしてください:@LeapcellHQ