Seit ich begonnen habe mit Go eigene Projekte zu entwickeln, stoße ich immer wieder auf dieselben Probleme. Daher speichere ich hier eine Liste der Tools, für die ich (meistens nach gründlicher Recherche) entschieden habe.

HTTP Router

  • ShiftPath
    // ShiftPath splits off the first component of p, which will be cleaned of
    // relative components before processing. head will never contain a slash and
    // tail will always be a rooted path without trailing slash.
    func ShiftPath(p string) (head, tail string) {
        p = path.Clean("/" + p)
        i := strings.Index(p[1:], "/") + 1
        if i <= 0 {
            return p[1:], "/"
        }
        return p[1:i], p[i:]
    }
  • Chi

Logging

  • Zap
    logger, _ := zap.NewProduction()
    defer logger.Sync()
    logger.Info("failed to fetch URL",
      // Structured context as strongly typed Field values.
      zap.String("url", url),
      zap.Int("attempt", 3),
      zap.Duration("backoff", time.Second),
    ) 

Static File Embedding

  • vfsgen
  • SPA Utility
    type spaFileSystem struct {
      root http.FileSystem
    }
     
    func (fs *spaFileSystem) Open(name string) (http.File, error) {
      f, err := fs.root.Open(name)
      if os.IsNotExist(err) {
        return fs.root.Open("index.html")
      }
     
      return f, err
    }
     
    fs := http.FileServer(&spaFileSystem{http.Dir("static")})
    http.Handle("/", fs)