Go в примерах: Линейные фильтры (Line Filters)

Линейный фильтр это распространенный вид программ, читающих стандартный вход (stdin), обрабатывающих его и выводящих результат в стандартный вывод (stdout). К примеру, grep и sed это линейные фильтры.

Данная программа является примером линейного фильтра, который выводит весь входящий текст большими буквами. Вы можете использовать этот паттерн для своих линейных фильтров на Go.

package main
import (
    "bufio"
    "fmt"
    "os"
    "strings"
)
func main() {

Создав обёртку небуферизированного os.Stdin в виде буферизированного сканера, мы можем использовать удобный метод Scan, который продвигает сканер к следующему токену. В сканере по-умолчанию, это будет следующая строка.

    scanner := bufio.NewScanner(os.Stdin)

Метод Text возвращает текущий токен, тоесть следующую входящую строку.

    for scanner.Scan() {
        ucl := strings.ToUpper(scanner.Text())

Напечатать результат в стандартный вывод (stdout)

        fmt.Println(ucl)
    }

Проверяем ошибки, которые могли вернуться после работы Scan. Конец файла (EOF) и так ожидается, поэтому не считается ошибкой.

    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "error:", err)
        os.Exit(1)
    }
}

Чтобы проверить наш линейный фильтр, создайте файл с парой строк в нижнем регистре.

$ echo 'hello'   > /tmp/lines
$ echo 'filter' >> /tmp/lines

Затем, используйте программу, чтобы получить капитализированные строки.

$ cat /tmp/lines | go run line-filters.go
HELLO
FILTER

Следующий пример: Аргументы командной строки (Command-Line Arguments).