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  }