项目初期配置都是写死的,为了方便后期上容器,需要实现灵活的配置。以mysql的访问为例:
以前是这样子的
db, err = gorm.Open(“mysql”, "root:@/test?charset=utf8&parseTime=True&loc=Local")
这种代码仅适合测试环境中使用,上不得生产环境。因此调研了go语言中开源的配置实现。最终选定viper,很简单。
首先,在项目根目录下建立config目录,创建config.go文件,内容如下:
package config
import (
"github.com/spf13/viper"
)
func LoadConfigFromYaml() (*viper.Viper, error) {
var v *viper.Viper
v = viper.New()
v.SetConfigName("config.yaml")
v.AddConfigPath("./config/")
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
return nil, err
}
return v, nil
}
在config目录下建立config.yaml文件,写入mysql相关的信息:
# cat config/config.yaml
db:
type: "mysql"
user: "root"
password: ""
host: "127.0.0.1"
database: "test"
然后在open mysql数据库时,通过viper获取各个string
v, err0 := config.LoadConfigFromYaml()
if err0 != nil {
log.Fatalf("Init DB error: %v", err0)
}
dbtype := v.GetString("db.type")
dbuser := v.Get("db.user")
dbpasswd := v.Get("db.password")
dbhost := v.Get("db.host")
dbname := v.Get("db.database")
db, err = gorm.Open(dbtype, fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
dbuser,
dbpasswd,
dbhost,
dbname))
OK,是不是比原来好多了~