github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/bestpractices/shortercode1.go (about) 1 // +build OMIT 2 3 package main 4 5 import ( 6 "encoding/binary" 7 "io" 8 "log" 9 "os" 10 ) 11 12 type Gopher struct { 13 Name string 14 AgeYears int 15 } 16 17 // Example of bad code, missing early return. OMIT 18 func (g *Gopher) WriteTo(w io.Writer) (size int64, err error) { 19 err = binary.Write(w, binary.LittleEndian, int32(len(g.Name))) 20 if err == nil { 21 size += 4 22 var n int 23 n, err = w.Write([]byte(g.Name)) 24 size += int64(n) 25 if err == nil { 26 err = binary.Write(w, binary.LittleEndian, int64(g.AgeYears)) 27 if err == nil { 28 size += 4 29 } 30 return 31 } 32 return 33 } 34 return 35 } 36 37 func main() { 38 g := &Gopher{ 39 Name: "Gophertiti", 40 AgeYears: 3382, 41 } 42 43 if _, err := g.WriteTo(os.Stdout); err != nil { 44 log.Printf("DumpBinary: %v\n", err) 45 } 46 } 47 48 // Example of bad API, it's better to use an interface. 49 func (g *Gopher) WriteToFile(f *os.File) (int64, error) { 50 return 0, nil 51 } 52 53 // Example of bad API, it's better to use a narrower interface. 54 func (g *Gopher) WriteToReadWriter(rw io.ReadWriter) (int64, error) { 55 return 0, nil 56 } 57 58 // Example of better API. 59 func (g *Gopher) WriteToWriter(f io.Writer) (int64, error) { 60 return 0, nil 61 }