Есть код, который обрабатывает входной поток stdin и выдает на stdout.
var input io.ReadCloser
	reader := bufio.NewReader(input)
 
	for {
		in, _, err := reader.ReadLine()
		if err != nil && err == io.EOF {
			break
		}
 
		in = append(in, []byte("\n")...)
		if _, err := w.Write(in); err != nil {
			log.Fatalln(err)
		}
	}
Хочу добавить дополнительные фильтры на входящий поток.
Фильтр будет реализовывать интерфейс с функцией 
Filter(io.Reader, io.Writer) error 
Как, имея массив фильтров, обработать входящий поток так, чтобы не было блокировок и в 
input находился обработанный поток после применения последнего фильтра?
То есть, по аналогии с применением pipe в командной строке.
Желательно, чтобы смог использовать типа функции 
applyFilters(input io.Reader) (io.Reader, error). Тогда я бы смог написать 
filteredInput, err = applyFilters(input)
reader := bufio.NewReader(filteredInput)
Использовать 
io.Pipe? Если да, то как?