I use https://github.com/BurntSushi/toml for parsing the configuration file. Because the library use the struct type for the configuration variable, we have to access the struct fields with a dot to get a value.
config.Database.Username
But I want to do it dynamically. I want to create a function that receive a string type key and return the configuration value. So I do it with this way.
package main import ( "fmt" "os" "reflect" "strings" "github.com/BurntSushi/toml" ) type tomlConfig struct { Database databaseInfo Title string } type databaseInfo struct { Username string Password string } // Function to get struct type variable by index name func GetField(t *tomlConfig, field string) string { r := reflect.ValueOf(t) f := reflect.Indirect(r) splitField := strings.Split(field, ".") for _, s := range splitField { f = f.FieldByName(strings.Title(s)) } return f.String() } // Function to get config by string func GetConfig(key string) string { var config tomlConfig if _, err := toml.Decode( ` title = "Text title" [database] username = "root" password = "password" `, &config); err != nil { fmt.Println("Please check your configuration file") os.Exit(1) } configValue := GetField(&config, key) return configValue } func main() { fmt.Println(GetConfig("testKey")) fmt.Println(GetConfig("database.testKey")) fmt.Println(GetConfig("title")) fmt.Println(GetConfig("database.username")) fmt.Println(GetConfig("database.password")) }
Result:
$ go run main.go <invalid Value> <invalid Value> Text title root password