Go by Example: 라인 필터

라인 필터 (line filter)는 stdin으로 입력을 읽고, 처리한 후, 나온 결괏값을 stdout으로 출력하는 일반적인 유형의 프로그램입니다. grepsed가 일반적인 라인 필터입니다.

다음은 모든 입력 텍스트의 대문자 버전을 작성하는 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

다음 예제: 커맨드라인 인자.