| // +build ignore,OMIT |
| |
| package main |
| |
| import ( |
| "bytes" |
| "encoding/binary" |
| "io" |
| "log" |
| "os" |
| ) |
| |
| type Gopher struct { |
| Name string |
| AgeYears int |
| } |
| |
| type binWriter struct { |
| w io.Writer |
| buf bytes.Buffer // HL |
| err error |
| } |
| |
| // Write writes a value to the provided writer in little endian form. |
| func (w *binWriter) Write(v interface{}) { |
| if w.err != nil { |
| return |
| } |
| switch x := v.(type) { |
| case string: |
| w.Write(int32(len(x))) |
| w.Write([]byte(x)) |
| case int: |
| w.Write(int64(x)) |
| default: |
| w.err = binary.Write(&w.buf, binary.LittleEndian, v) // HL |
| } |
| } |
| |
| // Flush writes any pending values into the writer if no error has occurred. |
| // If an error has occurred, earlier or with a write by Flush, the error is |
| // returned. |
| func (w *binWriter) Flush() (int64, error) { |
| if w.err != nil { |
| return 0, w.err |
| } |
| return w.buf.WriteTo(w.w) |
| } |
| |
| func (g *Gopher) WriteTo(w io.Writer) (int64, error) { |
| bw := &binWriter{w: w} |
| bw.Write(g.Name) |
| bw.Write(g.AgeYears) |
| return bw.Flush() // HL |
| } |
| |
| func main() { |
| g := &Gopher{ |
| Name: "Gophertiti", |
| AgeYears: 3382, |
| } |
| |
| if _, err := g.WriteTo(os.Stdout); err != nil { |
| log.Printf("DumpBinary: %v\n", err) |
| } |
| } |