code: func (config *Config) DataFromSection(sectionName string, data interface{}) bool {
  	section := config.sectionForName(sectionName)
  
  	if section == nil {
  		return false
  	}
  
  	values := section.values
  
  	fields := reflect.ValueOf(data).Elem()
  	dataType := fields.Type()
  
  	for i := 0; i < fields.NumField(); i++ {
  		field := fields.Field(i)
  
  		if !field.CanSet() {
  			continue
  		}
  
  		fieldType := dataType.Field(i)
  		fieldName := fieldType.Name
  
  		switch field.Type().Kind() {
  		case reflect.Bool:
  			field.SetBool(getBoolean(values, fieldName, field.Interface().(bool)))
  		case reflect.Int64:
  			field.SetInt(getInteger(values, fieldName, field.Interface().(int64)))
  		case reflect.Float64:
  			field.SetFloat(getFloat(values, fieldName, field.Interface().(float64)))
  		case reflect.String:
  			field.SetString(getString(values, fieldName, field.Interface().(string)))
  		case reflect.Array, reflect.Slice:
  			switch fieldType.Type.Elem().Kind() {
  			case reflect.Int64:
  				ints := getIntegers(values, fieldName)
  				if ints != nil {
  					field.Set(reflect.ValueOf(ints))
  				}
  			case reflect.Float64:
  				floats := getFloats(values, fieldName)
  				if floats != nil {
  					field.Set(reflect.ValueOf(floats))
  				}
  			case reflect.String:
  				strings := getStrings(values, fieldName)
  				if strings != nil {
  					field.Set(reflect.ValueOf(strings))
  				}
  			}
  		}
  	}
  	return true
  }
docs: /*
  DataFromSection reads the values of a section into a struct. The values should be of the types:
    bool
    string
    []string
    int64
    []int64
    float64
    []float64
  Values that are missing in the section are not set, and values that are missing in the
  struct but present in the section are ignored.
  
  If the section name matches the config.name or "" the global data is searched.
  */