Go в примери: Редовѝ филтри

Редовѝ филтър е често срещан вид програма, която чете данни от стандартния вход, обработва го и после извежда произведеното на стандартния изход. grep и sed са такива редовѝ филтри.

Ето примерен редовѝ филтър на Го, който извежда на екрана въведения словоплет, но с всички букви, превърнати в главни. Можете да ползвате този подход за писане на ваши собствени редовѝ филтри.

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

Като обгърнем нескладиращия поток os.Stdin със складиращ скенер, придобиваме удобен метод Scan, който премества скенера до следващ белег (token), който по подразбиране е знакът за нов ред.

    scanner := bufio.NewScanner(os.Stdin)

Text връща събраното до белега при последното извикване на Scan. В случая това е следващият ред от каквото е въвел потребителят и накрая е натиснал Enter/Return/↵

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

Извеждаме обърнтия в главни букви ред.

        fmt.Println(ucl)
    }

Проверяваме за грешки при сканирането. Грешката „Край на файл” е очаквана и не с докладва от Scan като грешка.

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

За да пробваме нашия редовѝ филтър, първо ще създадем файл с няколко реда с малки букви.

$ echo 'здрасти'   > /tmp/редове
$ echo 'цедко' >> /tmp/редове

После ползваме филтъра, за да изведем редовете, обърнати в главни букви.

$ cat /tmp/редове | go run line-filters.go 
ЗДРАСТИ
ЦЕДКО

Следващ пример: .