package string_utils import ( "os" "strings" ) //KeyReader is an interface to read string "<key>":"<value>" pairs //which is common to read from the environment //it is abstracted so the same interface can be implemented for //reading for example from REDIS and other sources type KeyReader interface { Keys(prefix string) []string GetString(key string) (value string, ok bool) } func EnvironmentKeyReader() KeyReader { return envKeyReader{} } type envKeyReader struct{} func (envKeyReader) GetString(key string) (value string, ok bool) { value = os.Getenv(key) if value == "" { return "", false } return value, true } func (envKeyReader) Keys(prefix string) []string { keys := []string{} for _, env := range os.Environ() { if strings.HasPrefix(env, prefix) { keys = append(keys, strings.SplitN(env, "=", 2)[0]) } } return keys }