Подтвердить что ты не робот

Эквивалент для понимания списка Python

Я играю с 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))

Большое спасибо

4b9b3361

Ответ 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.

Ответ 2

Если то, что вы ищете, действительно является пониманием списка python, в go AFAIK нет такого синтаксического эквивалента.

Способ сделать это - создать функцию, которая принимает срез и функцию (чтобы проверить условие) и вернуть новый срез.

EDIT: Хорошо похоже, что в Go уже есть такая функция. cf VonC