使用FuncOption来初始化对象

Golang语言层面上没有可以为一个变量初始化值的方法,但是在Golang中可以使用另一种方法Func Option,这使得我们可以初始化对象的默认值,并可以优雅的修改

以一个db的配置为例

type dbCfg struct {
	DriveName         string
	Dsn               string
	MaxIdleConnection int
	MaxOpenConnection int
	MaxQueryTime      int
}

先定一个Option

type Option func(*dbCfg)

然后将这个Option作为返回值,修改配置主要在func(*dbCfg)这个函数中,先写出一个修改DriveName的函数

func Drivename(drivename string) Option {
	return func(dbcfg *dbCfg) {
		dbcfg.DriveName = drivename
	}
}

下来是新建实例对象的代码,

// 返回初始化的值
func defaultdbOption() *dbCfg {
	return &dbCfg{
		DriveName:         "sqlite3",
		Dsn:               "sqlite3.db",
		MaxIdleConnection: 10,
		MaxOpenConnection: 5,
		MaxQueryTime:      3,
	}
}

func NewDb(opts ...Option) (err error) {
	dbcfg := defaultdbOption()
	for _, opt := range opts {
		opt(dbcfg)
	}
	_db, err = sql.Open(dbcfg.DriveName, dbcfg.Dsn)
	if err != nil {
		return err
	}
	_db.SetMaxOpenConns(dbcfg.MaxOpenConnection)
	_db.SetMaxIdleConns(dbcfg.MaxIdleConnection)
	err = _db.Ping()
	return err
}

opt就是上述用户修改默认配置的函数,只要将默认配置的指针传入就可以修改原来的默认配置了。 这种方法在go-micro中大量运用,很优雅的处理了默认值和修改默认值的关系

在自已的项目中使用func option初始化db的代码