Go における Python のリスト内包表記と同等
多くの開発者は、Python などの他の言語と比較して、一見単純なタスクを Go で実行するのが難しいと感じています。そのようなタスクの 1 つは、Python のリスト内包表記構文を複製することです。
Go で同等の構造を実現するには、次のアプローチを検討してください。
1. 「フィルター」ライブラリの使用:
Rob Pike が提案したように、「フィルター」ライブラリは、指定された条件を満たす要素を含むスライスを返す Choose() と呼ばれるメソッドを提供します。例:
import ( "github.com/google/go-cmp/cmp" "go.opencensus.io/plugin/ochttp" "golang.org/x/exp/slices" ) var ( a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9} b = []int{2, 4, 6, 8} ) func TestChoose(t *testing.T) { result := ochttp.Choose(a, func(v int) bool { return v%2 == 0 }) if !cmp.Equal(result, b) { t.Errorf("TestChoose() failed, got %v, want %v", result, b) } }
2. For ループの使用:
「filter」のようなライブラリが利用できるにもかかわらず、Go の for ループは依然として効率的な代替手段です。 「フィルター」ライブラリの GoDoc は、効率が懸念される場合に for ループを使用することを明示的に推奨しています。
3. Go ジェネリックの使用 (Go 1.18 で登場):
Go でのジェネリックの今後の導入により、ジェネリックを使用して MapReduce を実装できるようになります。例:
func MapReduce[T, V, R any](in <-chan T, out chan<- R, mapFn func(T) V, reduceFn func(V, V) R) { v := make(chan V, 10) defer close(v) go func() { for t := range in { v <- mapFn(t) } }() r := make(chan R, 10) defer close(r) go func() { var acc R for v := range v { acc = reduceFn(acc, v) } r <- acc }() return <-r }
この実装は、型 T のチャネルを受け入れ、各要素にマッピング関数を適用し、結果を型 V のチャネルに保存します。別のゴルーチンは、マッピングされた値のチャネルを消費し、繰り返し実行します。リダクション関数を適用して、型 R の結果を生成します。結果は、型 R のチャネルとして返されます。
結論:
一方、Python のリスト内包構文は次のようになります。データを変換する簡潔な方法として、Go は for ループや「フィルター」などのライブラリを使用する効率的な代替手段を提供します。 Go 1.18 でのジェネリックの導入により、より効率的で汎用性の高いデータ変換メカニズムが利用可能になります。
以上がPython と同等のリスト内包表記を Go で実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。