ホームページ  >  記事  >  バックエンド開発  >  Python と同等のリスト内包表記を Go で実現するにはどうすればよいですか?

Python と同等のリスト内包表記を Go で実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-12 16:22:02418ブラウズ

How to Achieve Python's List Comprehension Equivalent in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。