Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func EnvFileLookup ¶
EnvFileLookup returns a lookup function that reads environment variables from a .env file. It falls back to OS env if a file is not found. The .env file should have lines in the format KEY=VALUE. Comments starting with # are ignored. Empty lines are ignored. Notes:
- If both the .env file and OS environment define a key, the OS environment value wins.
- Lines like `export KEY=VALUE` are supported.
func IgnoreEmptyEnvLookup ¶
IgnoreEmptyEnvLookup wraps os.LookupEnv but treats empty values as unset. If the variable is present but "", it returns ok == false.
func Read ¶
Read populates holder (a pointer to struct) using the provided lookup function to resolve values.
Usage:
type C struct {
Port int `env:"PORT" envDefault:"8080"`
TLS struct {
Enabled bool `env:"ENABLED"`
Cert string `env:"CERT" envRequired:"true"`
} `envPrefix:"TLS"` // effective keys: TLS_ENABLED, TLS_CERT
}
var cfg C
if err := envconfig.Read(&cfg); err != nil { log.Fatal(err) }
Lookup source:
By default Read uses os.LookupEnv. You may pass a custom lookup function, e.g., envconfig.Read(&cfg, myLookup) where myLookup has signature func(string) (string, bool).
Tags (per field):
- `env:"NAME"` : the environment variable name for this field. Use `env:"-"` to skip the field entirely.
- `envDefault:"VAL"` : fallback used only when the variable is UNSET (i.e., lookup returns ok == false). If the variable is present but empty ("", ok == true), the empty value is used and default does NOT apply.
- `envRequired:"true"`: if the variable is UNSET and no envDefault is provided, Read returns an error. Only the literal "true" enables this behavior.
- `envPrefix:"PFX"` : for struct-typed fields (including embedded/ anonymous ones). Applies a prefix to all descendant leaf env names. Prefixes are joined with "_". Example: `envPrefix:"DB"` -> DB_HOST, DB_PORT.
Embedded and named struct fields:
- Embedded (anonymous) and named struct fields are treated "flat" by default (no extra prefix). To prefix a subtree, put `envPrefix` on the field.
Advanced use with EnvCollector:
EnvCollector is a special interface that can be implemented on a pointer receiver. When encountered, it will be called, moving env reading into the implementor. This is an advanced interface that helps to populate values that cannot be represented using struct tags.
Supported field types:
- primitives: string, bool, all int/uint sizes, float32/64
- time.Duration (parsed via time.ParseDuration)
- arrays, slices: comma-separated values (e.g. "a,b,c")
- maps: comma-separated k=v pairs (e.g. "k1=v1,k2=v2"); split on first "="
- pointers to any supported type (allocated only when a value is set; left nil otherwise - including pointer-to-struct fields where no descendant env var is found)
- any type implementing (in the priority) json.Unmarshaler > encoding.BinaryUnmarshaler > encoding.TextUnmarshaler
Precedence per leaf field:
- If lookupEnv returns (value, ok==true), that value is used as-is (even if value is the empty string "").
- Else, if `envDefault` is present, it is used.
- Else, if `envRequired:"true"`, Read returns an error.
- Else, the field is left at its zero value.
Errors when:
- `env` tag is empty
- Struct with `env` tag but no unmarshal interface
- Exported values without `env` tag
- EnvCollector with value (non-pointer) receiver
- A required field is missing and no default is provided
- holder is nil or not a pointer to a struct
- Struct fields specify both `env` and `envPrefix`
- `envPrefix` is empty when present
- Parsing/conversion failures (returned errors includes the env key)
- Unsupported leaf types (that do not implement a supported unmarshal interface)
Types ¶
type EnvCollector ¶ added in v0.3.0
type EnvCollector interface {
// CollectEnv is called with an EnvGetter for reading env values.
CollectEnv(env EnvGetter) error
}
EnvCollector is an advanced interface for collecting custom environment variables that can't be easily expressed via struct tags. For example, a custom collector can handle environment variables with complex naming conventions like USER_1, PASS_1, USER_2, PASS_2.
See TestEnvCollector for a concrete example.
type EnvGetter ¶ added in v0.3.0
type EnvGetter interface {
// Lookup performs a raw lookup for an environment variable.
Lookup(key string) (string, bool)
// ReadValue parses a single environment variable into a target.
// Target must be a pointer.
ReadValue(key string, target any) error
// ReadIntoStruct populates the target struct adding envPrefix + "_" for all `env` tags found on a struct.
// Target must be a pointer to a struct
ReadIntoStruct(envPrefix string, target any) error
}
EnvGetter provides a convenient way to get values from env variables. It is passed to EnvCollector.CollectEnv to allow a custom env collection. Under the hood it uses the provided Lookup in Read function.