Как применить множество фильтров на входящий поток?
Еще например вот так можно
type FReader struct {
	reader io.Reader
	filter func([]byte) (int, error)
}
func NewFReader(r io.Reader) *FReader {
	return &FReader{r, func(p []byte) (int, error) { return len(p), nil }}
}
func (fr *FReader) Filter(filter func([]byte) (int, error)) *FReader {
	return &FReader{fr, filter}
}
func (fr *FReader) Read(p []byte) (n int, err error) {
	n, err = fr.reader.Read(p)
	if err == nil && fr.filter != nil {
		n, err = fr.filter(p)
	}
	return
}
тогда можно написать
chainreader := NewFReader(myreader).Filter(myfilter1).Filter(myfilter2).Filter(myfilter3)https://play.golang.org/p/rakSV5kgqR9
 имея массив фильтров Не надо фильтры ложить в массив)

обработать входящий поток так, чтобы не было блокировок и в input находился обработанный поток после применения последнего фильтра? Каналы вам в помощь.

То есть, по аналогии с применением pipe в командной строке. Да-да, каналы вам в помощь) Они примерно так и работают.

Вообще в теле твоей функции чтения содержимого файла можно добавить вызовы анонимных функций, в которых будет описана фильтрация, или дёргать другие функции, можно написать метод (в зависимости как собираешься фильтровать), можно пойти "через каналы". По идее блокировок возникнуть не должно.