Goで遊んでいますが、他の言語では非常に単純なことをするのに非常に苦労しています。
同様の構文を再現したいと思います。
array = [a for a in anotherArray if (some condition)]
Goでそれを行うためのエレガントな方法は何ですか?特に配列で関数を使用する場合は、コードを単純化したいと思います。例えば:
min = min(abs(a[i], b[j]) for i in range(n)
for j in range(i, n))
どうもありがとう
興味深いことに、 Rob Pike 提案されたばかり(18時間前)ライブラリ filter は、あなたが望むことを少し実行します。
// Choose takes a slice of type []T and a function of type func(T) bool. (If
// the input conditions are not satisfied, Choose panics.) It returns a newly
// allocated slice containing only those elements of the input slice that
// satisfy the function.
ここでテスト済み :
func TestChoose(t *testing.T) {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
expect := []int{2, 4, 6, 8}
result := Choose(a, isEven)
twotwotwo
が指摘しているように コメント内 、 このライブラリのGoDoc は次のように述べています:
パッケージ
filter
には、フィルター関数の分散アプリケーションを介してスライスをフィルタリングするためのユーティリティ関数が含まれています。パッケージは、Goでそのようなものを書くことがいかに簡単かを確認するための実験です。簡単ですが、
for
ループも同じくらい簡単で効率的です。このパッケージは使用しないでください。
この警告は、ドキュメント " Summary of Go Generics Discussions "、セクション " 機能コード ":
これらは、
map
、reduce
(fold
)、filter
、Zip
など.ケース:
タイプセーフなデータ変換:map
、fold
、Zip
ジェネリックを使用することの利点:
データ変換を表現する簡潔な方法。ジェネリックを使用する場合の短所:
最速のソリューションでは、これらの変換を適用するタイミングと順序、および各ステップで生成されるデータの量を考慮する必要があります。
初心者には読みにくいです。代替ソリューション:
for
ループと通常の言語構成体を使用します。
あなたが探しているものが本当にpythonリスト内包表記である場合、go AFAIKにはそのような構文上の同等のものはありません。
それを行う方法は、スライスと関数(条件をテストするため)を取得する関数を作成し、新しいスライスを返すことです。
編集:Goにはすでにそのような機能があるようです。 cf VonC