diff --git a/examples/line-filters/line-filters.go b/examples/line-filters/line-filters.go index 7cd92da..38f60bc 100644 --- a/examples/line-filters/line-filters.go +++ b/examples/line-filters/line-filters.go @@ -8,18 +8,20 @@ // pattern to write your own Go line filters. package main -// Package `bufio` will help us read line-by-line. -import "bufio" -import "strings" -import "os" -import "io" +import ( + "bufio" + "fmt" + "io" + "os" + "strings" +) func main() { // Wrapping the unbuffered `os.Stdin` with a buffered // reader gives us a convenient `ReadString` method // that we'll use to read input line-by-line. - in := bufio.NewReader(os.Stdin) + rdr := bufio.NewReader(os.Stdin) out := os.Stdout // `ReadString` returns the next string from the @@ -27,24 +29,28 @@ func main() { // newline byte `'\n'` as our separator so we'll get // successive input lines. for { - inLine, err := in.ReadString('\n') + switch line, err := rdr.ReadString('\n'); err { + + // If the read succeeded (the read `err` is nil), + // write out out the uppercased line. Check for an + // error on this write as we do on the read. + case nil: + ucl := strings.ToUpper(line) + if _, err = out.WriteString(ucl); err != nil { + fmt.Fprintln(os.Stderr, "error:", err) + os.Exit(1) + } // The `EOF` error is expected when we reach the // end of input, so exit gracefully in that case. - // Otherwise there's a problem. - if err == io.EOF { - return - } - if err != nil { - panic(err) - } + case io.EOF: + os.Exit(0) - // Write out the uppercased line, checking for an - // error on the write as we did on the read. - outLine := strings.ToUpper(inLine) - _, err = out.WriteString(outLine) - if err != nil { - panic(err) + // Otherwise there's a problem; print the + // error and exit with non-zero status. + default: + fmt.Fprintln(os.Stderr, "error:", err) + os.Exit(1) } } }