функции фильтра и карты

Я программист на JavaScript, начинаю с Go. Я пытался воспроизвести filter и map функции, подобные JavaScript, в качестве упражнения.

Вот что я придумал.

В filter функция:

func Filter(slice interface{}, cb func(i interface{}) bool) []interface{}{
sliceValues := reflect.ValueOf(slice)
newSlice := []interface{}{}
for i := 0; i < sliceValues.Len(); i++{
    v := sliceValues.Index(i).Interface()
    passed := cb(v)
    if passed{
        newSlice = append(newSlice, v)
    }   
}
return newSlice
}

Применение:

a := []int {1,2,3}

result := Filter(a,func(i interface{}) bool{
    v,_:= i.(int)
    return v > 1
})

fmt.Println(result) // [2 3]

В map функция:

func Map(slice interface{}, cb func(i interface{}) interface{}) []interface{}{
sliceValues := reflect.ValueOf(slice)
newSlice := []interface{}{}
for i := 0; i < sliceValues.Len(); i++{
    v := sliceValues.Index(i).Interface()
    modifiedValue := cb(v)
    newSlice = append(newSlice, modifiedValue)
}
return newSlice

}

Применение:

a := []int {1,2,3}

result := Map(a,func(i interface{}) interface{}{
    v,_:= i.(int)
    return v + 1
})

fmt.Println(result) // [2 3 4]

1 ответ
1

От гения математики и естествознания:

«Если я и видел дальше, то стоя на плечах гигантов». Исаак Ньютон

Википедия: Стоять на плечах гигантов

Для гигантов го вы можете начать с Роба Пайка.

GitHub — robpike / filter: простой пакет apply / filter / reduce.

Я хотел увидеть, насколько сложно реализовать подобные вещи в Go с таким прекрасным API, каким я мог управлять. Это было несложно.

Написав его пару лет назад, мне ни разу не довелось им воспользоваться. Вместо этого я просто использую циклы «for».

Тебе тоже не стоит его использовать.

Воспользуйтесь советом Роба Пайка и используйте циклы «for».

  • Хорошо, но моя цель не только в том, чтобы сделать functions. Мне нужен кто-то, чтобы указать на ошибки в моем коде, чтобы я мог их исправить.

    — MrByte

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *