func NewWith(name string, fn func(c *Config)) *Config {
	return New(name).With(fn)
}
NewWith create config instance, and you can call some init func
package config
import (
	"bytes"
	"fmt"
	"os"
	"reflect"
	"regexp"
	"strings"
	"sync"
	"text/scanner"
	"github.com/mitchellh/mapstructure"
)
const (
	Ini  = "ini"
	Hcl  = "hcl"
	Yml  = "yml"
	JSON = "json"
	Yaml = "yaml"
	Toml = "toml"
	defaultDelimiter byte = '.'
	defaultStructTag = "mapstructure"
)
type intArr []int
type strArr []string
type intMap map[string]int
type strMap map[string]string
var dc = New("default")
type Driver interface {
	Name() string
	GetDecoder() Decoder
	GetEncoder() Encoder
}
type Decoder func(blob []byte, v interface{}) (err error)
type Encoder func(v interface{}) (out []byte, err error)
type Options struct {
	ParseEnv bool
	Readonly bool
	EnableCache bool
	ParseKey bool
	TagName string
	Delimiter byte
	DumpFormat string
	ReadFormat string
	DecoderConfig *mapstructure.DecoderConfig
}
type Config struct {
	err error
	name string
	lock sync.RWMutex
	opts *Options
	data map[string]interface{}
	loadedFiles  []string
	loadedDriver []string
	decoders map[string]Decoder
	encoders map[string]Encoder
	intCache map[string]int
	strCache map[string]string
	iArrCache map[string]intArr
	iMapCache map[string]intMap
	sArrCache map[string]strArr
	sMapCache map[string]strMap
}
func New(name string) *Config {
	return &Config{
		name: name,
		opts: newDefaultOption(),
		data: make(map[string]interface{}),
		encoders: map[string]Encoder{JSON: JSONEncoder},
		decoders: map[string]Decoder{JSON: JSONDecoder},
	}
}
func NewEmpty(name string) *Config {
	return &Config{
		name: name,
		opts: newDefaultOption(),
		data: make(map[string]interface{}),
		encoders: map[string]Encoder{},
		decoders: map[string]Decoder{},
	}
}