Suppose we have a text file that looks like this:
4-purely-functional/ch10-monads/02_error_checker/alphabet.txt ABCDEFGHIJKLMNOP
This code will read three sets of two characters:
func main() { file, err := os.Open("alphabet.txt") if err != nil { log.Fatal(err) } byteSlice := make([]byte, 2) numBytesRead, err := io.ReadFull(file, byteSlice) if err != nil { log.Fatal(err) } logInfo(numBytesRead, byteSlice) byteSlice = make([]byte, 2) numBytesRead, err = io.ReadFull(file, byteSlice) if err != nil { log.Fatal(err) } logInfo(numBytesRead, byteSlice) byteSlice = make([]byte, 2) numBytesRead, err = io.ReadFull(file, byteSlice) if err != nil { log.Fatal(err) } logInfo(numBytesRead, byteSlice)
We can improve our code by defining a struct with an error field and an io.Reader
field:
type twoByteReader struct { err error reader io.Reader }
You might remember from Chapter...