From 81adab6690cf4e284266a9321b213882a334778f Mon Sep 17 00:00:00 2001 From: Inanc Gumus Date: Fri, 8 Nov 2019 10:52:46 +0300 Subject: [PATCH] refactor: handle err with fprintln io ifaces --- interfaces/13-io/main.go | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/interfaces/13-io/main.go b/interfaces/13-io/main.go index 3f753c8..3b86e0f 100644 --- a/interfaces/13-io/main.go +++ b/interfaces/13-io/main.go @@ -11,7 +11,6 @@ package main import ( "fmt" "io" - "log" "os" ) @@ -21,31 +20,36 @@ func main() { // #1: reads from the standard input // ------------------------------------------------ // if err := read(os.Stdin); err != nil { - // log.Fatal(err) + // fmt.Fprintln(os.Stderr, err) + // return // } // #2: writes to the standard output // ------------------------------------------------ // buf := []byte("hi!\n") // if err := write(os.Stdout, buf); err != nil { - // log.Fatal(err) + // fmt.Fprintln(os.Stderr, err) + // return // } // #2b: reads the entire file content into memory. // ------------------------------------------------ // buf, err := ioutil.ReadFile("alice.txt") // if err != nil { - // log.Fatal(err) + // fmt.Fprintln(os.Stderr, err) + // return // } // if err := write(os.Stdout, buf); err != nil { - // log.Fatal(err) + // fmt.Fprintln(os.Stderr, err) + // return // } // #3: reads and writes with 32KB of memory // no matter how large the source data is. // ------------------------------------------------ if err := ioCopy(os.Stdout, os.Stdin); err != nil { - log.Fatal(err) + fmt.Fprintln(os.Stderr, err) + return } } @@ -78,7 +82,7 @@ func ioCopy(dst, src *os.File) error { return nil } -// write method example. +// write example. func write(dst *os.File, buf []byte) error { nw, ew := dst.Write(buf) @@ -87,3 +91,25 @@ func write(dst *os.File, buf []byte) error { return ew } + +// read example. +func read(src *os.File) error { + buf := make([]byte, 1024*32) // in the middle. + // buf := make([]byte, 148157) // defies the purpose of streaming. + // buf := make([]byte, 8) // too many chunking. + + for { + nr, er := src.Read(buf) + // fmt.Printf("buf : %q\n", buf[0:nr]) + fmt.Printf("read : %d bytes\n", nr) + fmt.Printf("read err : %v\n", er) + + if er == io.EOF { + return nil + } + if er != nil { + return er + } + } + return nil +}