Go با مثال: فیلترهای خطی

فیلتر خطی (line filter) نوع رایجی از برنامه است که ورودی را از stdin می‌خواند، پردازش می‌کند و سپس نتیجه‌ای را در stdout چاپ می‌کند. grep و sed فیلترهای خطی رایجی هستند.

این نمونه‌ای از یک فیلتر خطی در Go است که نسخهٔ حروف‌بزرگِ کل متن ورودی را می‌نویسد. می‌توانید از همین الگو برای نوشتن فیلترهای خطی خودتان در 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())

خط با حروف بزرگ را می‌نویسیم.

        fmt.Println(ucl)
    }

خطاهای حین Scan را بررسی می‌کنیم. پایان فایل قابل‌انتظار است و Scan آن را به‌عنوان خطا گزارش نمی‌کند.

    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

مثال بعدی: .