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