Идиоматическая замена для карты/уменьшения/фильтра /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 :)