Cache homedir between invocations.

The homedir of a user doesn't change anyway. Massively speeds up the
case where $HOME isn't set.

Before: BenchmarkDir    1000         2571286 ns/op
After:  BenchmarkDir    1000000000   2.77 ns/op
1 file changed
tree: 0f0d50841473838ab237a788ef0c45da9dc328a9
  1. homedir.go
  2. homedir_test.go
  3. LICENSE
  4. README.md
README.md

go-homedir

This is a Go library for detecting the user's home directory without the use of cgo, so the library can be used in cross-compilation environments.

Usage is incredibly simple, just call homedir.Dir() to get the home directory for a user, and homedir.Expand() to expand the ~ in a path to the home directory.

Why not just use os/user? The built-in os/user package requires cgo on Darwin systems. This means that any Go code that uses that package cannot cross compile. But 99% of the time the use for os/user is just to retrieve the home directory, which we can do for the current user without cgo. This library does that, enabling cross-compilation.