Ответ 1
Интересно, что Роб Пайк только что предложил (18 часов назад) библиотечный фильтр, который немного выполняет то, что вы хотите:
Смотрите , например, Choose()
// 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
также просты и эффективнее.Вы не должны использовать этот пакет.
Это предостережение отражено в документе "Сводка обсуждений по обобщенным материалам Go", раздел "Функциональный код":
These are the usual higher-order functions such as
map
,reduce
(fold
),filter
,zip
etc.Cases:
typesafe data transformations:map
,fold
,zip
Плюсы за использование дженериков:
Краткий способ выразить преобразования данных.Минусы использования дженериков:
Самое быстрое решение должно учитывать, когда и в каком порядке применять эти преобразования, а также объем данных, генерируемых на каждом этапе.
Труднее читать новичкам.Alternative solutions:
use
for
loops и usual language constructs.