github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/4-purely-functional/ch10-monads/02_error_checker/main.go (about) 1 package main 2 3 import ( 4 "os" 5 "log" 6 "io" 7 ) 8 9 func logInfo(numBytesRead int, byteSlice []byte) { 10 log.Printf("Number of bytes read: %d\n", numBytesRead) 11 log.Printf("Data read: %s\n", byteSlice) 12 13 } 14 15 type twoByteReader struct { 16 err error 17 reader io.Reader 18 } 19 20 func (tbr *twoByteReader) read() (numBytesRead int, byteSlice []byte) { 21 if tbr.err != nil { 22 return 23 } 24 byteSlice = make([]byte, 2) 25 numBytesRead, tbr.err = io.ReadFull(tbr.reader, byteSlice) 26 logInfo(numBytesRead, byteSlice) 27 return 28 } 29 30 func main() { 31 file, err := os.Open("alphabet.txt") 32 if err != nil { 33 log.Fatal(err) 34 } 35 36 byteSlice := make([]byte, 2) 37 numBytesRead, err := io.ReadFull(file, byteSlice) 38 if err != nil { 39 log.Fatal(err) 40 } 41 logInfo(numBytesRead, byteSlice) 42 43 byteSlice = make([]byte, 2) 44 numBytesRead, err = io.ReadFull(file, byteSlice) 45 if err != nil { 46 log.Fatal(err) 47 } 48 logInfo(numBytesRead, byteSlice) 49 50 byteSlice = make([]byte, 2) 51 numBytesRead, err = io.ReadFull(file, byteSlice) 52 if err != nil { 53 log.Fatal(err) 54 } 55 logInfo(numBytesRead, byteSlice) 56 57 tbr := &twoByteReader{reader: file} 58 byteSlice = make([]byte, 2) 59 tbr.read() 60 tbr.read() 61 tbr.read() 62 }