在线文档  >   Golang练习   >   行过滤器

行过滤器是一种常见类型的程序,它从标准输入读取输入,对其进行处理,然后将某些派生结果打印到标准输出。grepsed 是常见的行过滤器。

这里有一个Go中的示例行过滤器,它将所有输入文本的大写版本写入到标准输出中。你可以使用这个模式来编写你自己的Go行过滤器。

package main

import (
    "bufio"        // 引入bufio包以提供缓冲区扫描器
    "fmt"
    "os"            // 引入os包以便访问标准输入和输出
    "strings"
)

func main() {

    // 将未缓冲的`os.Stdin`包装为带有缓冲区的扫描器,这使我们可以使用方便的`Scan`方法,该方法会将扫描器推进到下一个标记,也就是默认扫描器中的下一行。
    scanner := bufio.NewScanner(os.Stdin)

    // 循环扫描器进行扫描,直到输入已经扫描完毕。
    for scanner.Scan() {
        // `Text`方法返回当前标记,这里就是输入的下一行。
        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