当前位置: 首页 > news >正文

商城开发网站建设百度宁波运营中心

商城开发网站建设,百度宁波运营中心,wordpress主页定制,美工设计素材网站在实际开发中,我们往往会给一个逻辑设计一套配置文件,用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样,我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项,比如数据库的名称等…

在实际开发中,我们往往会给一个逻辑设计一套配置文件,用于根据不同环境加载不同配置。
比如生产环境和测试环境数据库的地址不一样,我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项,比如数据库的名称等。难道相同的配置要像下面这样写多次吗?

version: 1
pro:write_pool:url: pro-write.comport: 11port: 5432user_name: write_pool_user_namepassword: write_pool_passworddbname: dbnamemax_idle_Conns: 1max_open_conns: 1conn_max_lifetime_seconds: 3user:username: unpassword: pwdread_pool:url: pro-read.comport: 5432user_name: read_pool_user_namepassword: read_pool_passworddbname: dbnamemax_idle_Conns: 1max_open_conns: 1conn_max_lifetime_seconds: 3user:username: unpassword: pwd
dev:write_pool:url: dev-write.comport: 11port: 5432user_name: write_pool_user_namepassword: write_pool_passworddbname: dbnamemax_idle_Conns: 1max_open_conns: 1conn_max_lifetime_seconds: 3user:username: unpassword: pwdread_pool:url: dev-read.comport: 5432user_name: read_pool_user_namepassword: read_pool_passworddbname: dbnamemax_idle_Conns: 1max_open_conns: 1conn_max_lifetime_seconds: 3user:username: unpassword: pwd

一种简单的办法是:我们设置一个默认项(default)用于填充相同的值,然后在不同环境中填充不同的值。比如下例:

# db.yaml
version: 1
pro:write_pool:url: pro-write.comport: 11read_pool:url: pro-read.com
pre:write_pool:url: pre-write.comread_pool:url: pre-read.com
test:write_pool:url: test-write.comread_pool:url: test-read.com
dev:write_pool:url: dev-write.comread_pool:url: dev-read.com
default:write_pool:port: 5432user_name: write_pool_user_namepassword: write_pool_passworddbname: dbnamemax_idle_Conns: 1max_open_conns: 1conn_max_lifetime_seconds: 3user:username: unpassword: pwdread_pool:port: 5432user_name: read_pool_user_namepassword: read_pool_passworddbname: dbnamemax_idle_Conns: 1max_open_conns: 1conn_max_lifetime_seconds: 3user:username: unpassword: pwd

这样我们在取pro、pre、dev和test环境的配置时,会让它们和default取合集,从而变成一个完整的配置。

实现

具体实现如下:

package configparserimport ("fmt""os""reflect""gopkg.in/yaml.v3"
)type Config struct {Version string      `yaml:"version"`Pro     interface{} `yaml:"pro"`Pre     interface{} `yaml:"pre"`Dev     interface{} `yaml:"dev"`Test    interface{} `yaml:"test"`Default interface{} `yaml:"default"`
}const (ErrorEnvNotfound = "env [%s] not found"KeyFieldTag      = "yaml"
)func LoadConfigFromFile(filePath string, env string) (string, error) {data, err := os.ReadFile(filePath)if err != nil {return "", err}return LoadConfigFromMemory(data, env)
}func LoadConfigFromMemory(configure []byte, env string) (string, error) {var config Configerr := yaml.Unmarshal(configure, &config)if err != nil {return "", err}configReflectType := reflect.TypeOf(config)for i := 0; i < configReflectType.NumField(); i++ {structTag := configReflectType.Field(i).Tag.Get(KeyFieldTag)if structTag == env {envConfigReflect := reflect.ValueOf(config).Field(i).Interface()defauleConfigReflectType := config.Defaultif envConfigReflect == nil && defauleConfigReflectType == nil {return "", fmt.Errorf(ErrorEnvNotfound, env)}if envConfigReflect == nil {defaultConf, err := yaml.Marshal(config.Default)if err != nil {return "", err}return string(defaultConf), nil}if defauleConfigReflectType == nil {envConf, err := yaml.Marshal(reflect.ValueOf(config).Field(i).Interface())if err != nil {return "", err}return string(envConf), nil}merged := mergeMapStringInterface(reflect.ValueOf(config).Field(i).Interface().(map[string]interface{}), config.Default.(map[string]interface{}))mergedConf, err := yaml.Marshal(merged)if err != nil {return "", err}return string(mergedConf), nil}}return "", fmt.Errorf(ErrorEnvNotfound, env)
}func mergeMapStringInterface(cover map[string]interface{}, base map[string]interface{}) map[string]interface{} {for k, v := range cover {switch v.(type) {case map[string]interface{}:if base[k] == nil {base[k] = v} else {mergeMapStringInterface(v.(map[string]interface{}), base[k].(map[string]interface{}))}default:base[k] = v}}return base
}

调用例子

package mainimport ("fmt"configparser "gconf""os""path""gopkg.in/yaml.v3"
)type PostgresSqlConnConfigs struct {WritePool PostgresSqlConnPoolConf `yaml:"write_pool"`ReadPool  PostgresSqlConnPoolConf `yaml:"read_pool"`
}type PostgresSqlConnPoolConf struct {Url                    *string `yaml:"url"`Port                   *string `yaml:"port"`UserName               *string `yaml:"user_name"`Password               *string `yaml:"password"`DbName                 *string `yaml:"dbname"`MaxIdleConn            *int    `yaml:"max_idle_Conns"`MaxOpenConn            *int    `yaml:"max_open_conns"`ConnMaxLifetimeSeconds *int64  `yaml:"conn_max_lifetime_seconds"`UserA                  *User   `yaml:"user"`
}type User struct {Username *string `yaml:"username"`Password *string `yaml:"password"`
}func main() {runPath, _ := os.Getwd()confPath := path.Join(runPath, "conf/db.yaml")env := []string{"dev", "test", "pre", "pro"}for _, v := range env {var conf ExampleConfigcurConfig, err := configparser.LoadConfigFromFile(confPath, v)if err != nil {fmt.Printf("load config file failed, err: %v", err)}err = yaml.Unmarshal([]byte(curConfig), &conf)if err != nil {fmt.Printf("unmarshal config file failed, err: %v", err)}fmt.Printf("%s\nconfig: %v\n", v, conf)}
}
http://www.dt0577.cn/news/7222.html

相关文章:

  • 女生做网站前端设计师网络营销主要特点有哪些
  • 儿童玩具网站模板郑州网络推广排名
  • 网站开放培训微信scrm
  • 广州专业做网站排名哪家好网站策划方案范文
  • W做网站济南优化seo公司
  • 支付网站建设费用计入关键词排名优化品牌
  • 17zwd一起做网站普宁上海推广系统
  • 做网站能用的字体seo搜索引擎优化工资
  • seo免费网站建设网站描述和关键词怎么写
  • 做网站一个月20g流量够吗外贸seo推广公司
  • 免费发布信息的网站百度下载应用
  • 唯美谷网站建设百度快照查询
  • wordpress在线安装插件百度seo推广
  • 如何申请一个网站 做视频直播深圳网络推广市场
  • 如何在图片上做网站水印图百度竞价推广后台
  • wordpress分享获得优惠广州seo网站推广
  • 创做网站seo排名优化培训网站
  • 上海平台网站开发怎么在百度制作自己的网站
  • 做网站的职位叫什么上海网站排名优化怎么做
  • 帝国做的网站怎么上传今日重大新闻头条财经
  • 陕西网站建设公司找哪家好厦门站长优化工具
  • 网站301跳转有坏处吗重庆网站建设软件
  • 和萝莉做的电影网站网站seo哪家好
  • wordpress sufficeseo基础知识考试
  • 内蒙古建信建设有限公司网站google下载安卓版下载
  • 做介绍的英文网站长沙网站优化
  • 长春启做网站多少百度竞价账户
  • 关于做网站谷歌seo排名技巧
  • 网站建设总体目标seo在线优化工具
  • 益软网络工作室专业搜索引擎seo合作