Package getenv provides a simple way to get environment variables. It's type-safe and supports built-in types and slices of them. Empty environment variable values are treated as not set.
Types supported:
- string
- []string
- int
- []int
- int8
- []int8
- int16
- []int16
- int32
- []int32
- int64
- []int64
- uint8
- []uint8
- uint16
- []uint16
- uint64
- []uint64
- uint
- []uint
- uintptr
- []uintptr
- uint32
- []uint32
- float32
- []float32
- float64
- []float64
- time.Time
- []time.Time
- time.Duration
- []time.Duration
- bool
- []bool
- url.URL
- []url.URL
- net.IP
- []net.IP
- netip.Addr
- []netip.Addr
- netip.Prefix
- []netip.Prefix
- net.HardwareAddr
- []net.HardwareAddr
- complex64
- []complex64
- complex128
- []complex128
Env retrieves the value of the environment variable named by the key. If the variable is present in the environment the value will be parsed and returned. Otherwise, an error will be returned.
package main
import (
"fmt""net""net/url""os""time""github.com/obalunenko/getenv""github.com/obalunenko/getenv/option"
)
funcmain() {
const (
key="GH_GETENV_TEST"
)
var (
valanyerrerror
)
deferfunc() {
iferr=os.Unsetenv(key); err!=nil {
panic(err)
}
}()
// stringiferr=os.Setenv(key, "golly"); err!=nil {
panic(err)
}
val, err= getenv.Env[string](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// intiferr=os.Setenv(key, "123"); err!=nil {
panic(err)
}
val, err= getenv.Env[int](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// int conversion erroriferr=os.Setenv(key, "123s4"); err!=nil {
panic(err)
}
val, err= getenv.Env[int](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// time.Timeiferr=os.Setenv(key, "2022-01-20"); err!=nil {
panic(err)
}
val, err=getenv.Env[time.Time](key, option.WithTimeLayout("2006-01-02"))
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// []float64iferr=os.Setenv(key, "26.89,0.67"); err!=nil {
panic(err)
}
val, err=getenv.Env[[]float64](key, option.WithSeparator(","))
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// time.Durationiferr=os.Setenv(key, "2h35m"); err!=nil {
panic(err)
}
val, err= getenv.Env[time.Duration](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// url.URLiferr=os.Setenv(key, "https://test:abcd123@golangbyexample.com:8000/tutorials/intro?type=advance&compact=false#history"); err!=nil {
panic(err)
}
val, err= getenv.Env[url.URL](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// net.IPiferr=os.Setenv(key, "2001:cb8::17"); err!=nil {
panic(err)
}
val, err= getenv.Env[net.IP](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// []stringiferr=os.Setenv(key, "a,b,c,d"); err!=nil {
panic(err)
}
val, err=getenv.Env[[]string](key, option.WithSeparator(","))
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// complex128iferr=os.Setenv(key, "1+2i"); err!=nil {
panic(err)
}
val, err= getenv.Env[complex128](key)
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
// []complex64iferr=os.Setenv(key, "1+2i,3+4i"); err!=nil {
panic(err)
}
val, err=getenv.Env[[]complex64](key, option.WithSeparator(","))
fmt.Printf("[%T]: %v; err: %v\n", val, val, err)
}Output:
[string]: golly; err: <nil>
[int]: 123; err: <nil>
[int]: 0; err: failed to parse environment variable[GH_GETENV_TEST]: strconv.ParseInt: parsing "123s4": invalid syntax: invalid value
[time.Time]: 2022-01-20 00:00:00 +0000 UTC; err: <nil>
[[]float64]: [26.89 0.67]; err: <nil>
[time.Duration]: 2h35m0s; err: <nil>
[url.URL]: https://test:abcd123@golangbyexample.com:8000/tutorials/intro?type=advance&compact=false#history; err: <nil>
[net.IP]: 2001:cb8::17; err: <nil>
[[]string]: [a b c d]; err: <nil>
[complex128]: (1+2i); err: <nil>
[[]complex64]: [(1+2i) (3+4i)]; err: <nil>
EnvOrDefault retrieves the value of the environment variable named by the key. If the variable is present in the environment the value will be parsed and returned. Otherwise, the default value will be returned. The value returned will be of the same type as the default value.
package main
import (
"fmt""net""net/url""os""time""github.com/obalunenko/getenv""github.com/obalunenko/getenv/option"
)
funcmain() {
const (
key="GH_GETENV_TEST"
)
deferfunc() {
iferr:=os.Unsetenv(key); err!=nil {
panic(err)
}
}()
varvalany// stringiferr:=os.Setenv(key, "golly"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, "golly")
fmt.Printf("[%T]: %v\n", val, val)
// intiferr:=os.Setenv(key, "123"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, -99)
fmt.Printf("[%T]: %v\n", val, val)
// time.Timeiferr:=os.Setenv(key, "2022-01-20"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key,
time.Date(1992, 12, 1, 0, 0, 0, 0, time.UTC),
option.WithTimeLayout("2006-01-02"),
)
fmt.Printf("[%T]: %v\n", val, val)
// []float64iferr:=os.Setenv(key, "26.89,0.67"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, []float64{-99},
option.WithSeparator(","),
)
fmt.Printf("[%T]: %v\n", val, val)
// time.Durationiferr:=os.Setenv(key, "2h35m"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, time.Second)
fmt.Printf("[%T]: %v\n", val, val)
// url.URLiferr:=os.Setenv(key, "https://test:abcd123@golangbyexample.com:8000/tutorials/intro?type=advance&compact=false#history"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, url.URL{})
fmt.Printf("[%T]: %v\n", val, val)
// net.IPiferr:=os.Setenv(key, "2001:cb8::17"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, net.IP{})
fmt.Printf("[%T]: %v\n", val, val)
// []stringiferr:=os.Setenv(key, "a,b,c,d"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, []string{}, option.WithSeparator(","))
fmt.Printf("[%T]: %v\n", val, val)
// complex128iferr:=os.Setenv(key, "1+2i"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, complex128(0))
fmt.Printf("[%T]: %v\n", val, val)
// []complex64iferr:=os.Setenv(key, "1+2i,3+4i"); err!=nil {
panic(err)
}
val=getenv.EnvOrDefault(key, []complex64{}, option.WithSeparator(","))
fmt.Printf("[%T]: %v\n", val, val)
}Output:
[string]: golly
[int]: 123
[time.Time]: 2022-01-20 00:00:00 +0000 UTC
[[]float64]: [26.89 0.67]
[time.Duration]: 2h35m0s
[url.URL]: https://test:abcd123@golangbyexample.com:8000/tutorials/intro?type=advance&compact=false#history
[net.IP]: 2001:cb8::17
[[]string]: [a b c d]
[complex128]: (1+2i)
[[]complex64]: [(1+2i) (3+4i)]