github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/bestpractices/shortercode4.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 type binWriter struct { 18 w io.Writer 19 size int64 20 err error 21 } 22 23 // Write writes a value to the provided writer in little endian form. 24 func (w *binWriter) Write(v interface{}) { 25 if w.err != nil { 26 return 27 } 28 switch v.(type) { // HL 29 case string: 30 s := v.(string) 31 w.Write(int32(len(s))) 32 w.Write([]byte(s)) 33 case int: 34 i := v.(int) 35 w.Write(int64(i)) 36 default: 37 if w.err = binary.Write(w.w, binary.LittleEndian, v); w.err == nil { 38 w.size += int64(binary.Size(v)) 39 } 40 } 41 } 42 43 func (g *Gopher) WriteTo(w io.Writer) (int64, error) { 44 bw := &binWriter{w: w} 45 bw.Write(g.Name) // HL 46 bw.Write(g.AgeYears) 47 return bw.size, bw.err 48 } 49 50 func main() { 51 g := &Gopher{ 52 Name: "Gophertiti", 53 AgeYears: 3382, 54 } 55 56 if _, err := g.WriteTo(os.Stdout); err != nil { 57 log.Printf("DumpBinary: %v\n", err) 58 } 59 }