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  }