Merge pull request #22 from mmcgrana/idiomatic-line-filters
Idiomatic line filters
This commit is contained in:
commit
87fa837f18
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user