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  }