filtering
package main
import (
"fmt"
"sync"
)
type FilterFunc func(int) bool
func notTwo(value int) bool {
return value == 2
}
func notFive(value int) bool {
return value == 5
}
func main() {
a := []int{1, 2, 3, 4, 5, 6, 7, 8}
b := filter(a, notTwo, notFive)
fmt.Println(a)
fmt.Println(b)
}
//=======================================================================
/**
filter function
*/
func filter(a []int, filters ...FilterFunc) []int {
var wg sync.WaitGroup
resChan := make(chan int, len(a))
for _, value := range a {
wg.Add(1)
go filtering(value, &wg, resChan, filters...)
}
wg.Wait()
close(resChan)
res := make([]int, 0)
for val := range resChan {
res = append(res, val)
}
return res
}
/**
do filtering for value
*/
func filtering(value int, wg *sync.WaitGroup, resChan chan int, filters... FilterFunc) {
defer wg.Done()
println("value: ", value)
for _, filter := range filters {
if filter(value) {
return
}
}
resChan<-value
}