Идиоматическая замена для карты/уменьшения/фильтра /etc
У меня есть список вещей в программе Go. Я хочу зациклить их и выполнить некоторую операцию с подмножеством этих вещей. Есть ли более элегантный/идиоматический код для этого, чем следующий?
for key, value := range listOfThings {
if(!value.Enabled) {
continue;
}
doTheThing(key, value)
}
Большой контекст - я исхожу из языков, где карта/редукция/фильтр/и т.д. являются популярными шаблонами для такого рода вещей, но в Интернете есть слово, что эти виды абстракций более высокого уровня на самом деле не из тех, что надо делать.
Есть ли в моих блоках диапазона что-то более элегантное, чем предложения guard/continue
для такого рода кода?
Ответы
Ответ 1
Простой пакет apply/filter/reduce.
Я хотел видеть, как трудно было реализовать такие вещи в Go, с таким же хорошим API, каким я мог бы управлять. Это было не сложно.
Написав пару лет назад, я не имел возможности использовать его один раз. Вместо этого я просто использую "для" циклов.
Вы не должны его использовать.
Роб Пайк
Следуйте совету Роба. Используйте для циклов.
Ответ 2
Если вам все еще интересно, пакет go-funk
позволит вам сделать карту/уменьшить/отфильтровать и т.д.
Эта библиотека на момент ответа регулярно обновляется. Предыдущая упомянутая библиотека не обновлялась в течение 4 лет.
Github - Go Funk
Ответ 3
Я не согласен с цитатой peterSO. Если вы хотите использовать golang для реализации механизма запросов, такого как presto/Athena/hive/impala/sparkSQL, вам нужно создать слой абстракции map/Reduction/Filter. Без этого не так просто переписать термины из select/где такие SQL-запросы.
Конечно, есть более глубокая причина, почему мы не видим, что механизм обработки запросов реализован в Golang :)