AppName string `config:"app_name" default:"my_app"`
Port int `config:"port" default:"8080"`
Debug bool `config:"debug" default:"false"`
func (c *Config) UpdatePort(newPort int) (int, int) {
type ConfigManager struct {
func (cm *ConfigManager) CallMethod(methodName string, args ...interface{}) []interface{} {
v := reflect.ValueOf(cm.config)
if v.Kind() != reflect.Ptr {
method := v.MethodByName(methodName)
fmt.Errorf("method %s not found", methodName),
in := make([]reflect.Value, len(args))
for i, arg := range args {
in[i] = reflect.ValueOf(arg)
result := make([]interface{}, len(out))
for i, outVal := range out {
result[i] = outVal.Interface()
func createInstance(t reflect.Type) interface{} {
return reflect.New(t).Interface()
func (cm *ConfigManager) LoadFromMap(data map[string]string) error {
v := reflect.ValueOf(cm.config).Elem()
for i := 0; i < t.NumField(); i++ {
configKey := fieldType.Tag.Get("config")
defaultValue := fieldType.Tag.Get("default")
intValue, err := strconv.Atoi(value)
field.SetInt(int64(intValue))
boolValue, err := strconv.ParseBool(value)
configManager := &ConfigManager{config: config}
configData := map[string]string{
err := configManager.LoadFromMap(configData)
fmt.Printf("app_name=%s, port=%d, debug=%t\n", config.AppName, config.Port, config.Debug) // app_name=test_app, port=3000, debug=false
results := configManager.CallMethod("UpdatePort", 8000)
for _, result := range results {
fmt.Printf("Update app_name=%s, port=%d, debug=%t\n", config.AppName, config.Port, config.Debug) // Update app_name=test_app, port=8000, debug=false
personType := reflect.TypeOf(Person{})
instance := createInstance(personType)
if person, ok := instance.(*Person); ok {
fmt.Printf("Person: %+v\n", person) // Person: &{Name:John Age:30}