Я программист на 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 ответ
От гения математики и естествознания:
«Если я и видел дальше, то стоя на плечах гигантов». Исаак Ньютон
Для гигантов го вы можете начать с Роба Пайка.
GitHub — robpike / filter: простой пакет apply / filter / reduce.
Я хотел увидеть, насколько сложно реализовать подобные вещи в Go с таким прекрасным API, каким я мог управлять. Это было несложно.
Написав его пару лет назад, мне ни разу не довелось им воспользоваться. Вместо этого я просто использую циклы «for».
Тебе тоже не стоит его использовать.
Воспользуйтесь советом Роба Пайка и используйте циклы «for».
Хорошо, но моя цель не только в том, чтобы сделать functions. Мне нужен кто-то, чтобы указать на ошибки в моем коде, чтобы я мог их исправить.
— MrByte