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

子网站建设的好处网站建设198

子网站建设的好处,网站建设198,网站qq在线代码,云盘网站如何做在实际开发中#xff0c;我们往往会给一个逻辑设计一套配置文件#xff0c;用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样#xff0c;我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项#xff0c;比如数据库的名称等…在实际开发中我们往往会给一个逻辑设计一套配置文件用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项比如数据库的名称等。难道相同的配置要像下面这样写多次吗 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 (fmtosreflectgopkg.in/yaml.v3 )type Config struct {Version string yaml:versionPro interface{} yaml:proPre interface{} yaml:preDev interface{} yaml:devTest interface{} yaml:testDefault interface{} yaml:default }const (ErrorEnvNotfound env [%s] not foundKeyFieldTag 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 (fmtconfigparser gconfospathgopkg.in/yaml.v3 )type PostgresSqlConnConfigs struct {WritePool PostgresSqlConnPoolConf yaml:write_poolReadPool PostgresSqlConnPoolConf yaml:read_pool }type PostgresSqlConnPoolConf struct {Url *string yaml:urlPort *string yaml:portUserName *string yaml:user_namePassword *string yaml:passwordDbName *string yaml:dbnameMaxIdleConn *int yaml:max_idle_ConnsMaxOpenConn *int yaml:max_open_connsConnMaxLifetimeSeconds *int64 yaml:conn_max_lifetime_secondsUserA *User yaml:user }type User struct {Username *string yaml:usernamePassword *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.zqtcl.cn/news/538752/

相关文章:

  • 点网站出图片怎么做能看人与动物做的网站
  • 免费开源建站系统源码wordpress公共函数在哪里
  • 西昌市建设工程管理局网站模块化网站开发
  • 无限看片的视频大全免费下载上海网络优化方法
  • 物流公司做网站注重什么问题中国建设银行征信中心网站
  • 教务处网站建设专业做鞋子的网站吗
  • 梦幻创意网站建设成都做网站设计哪家便宜
  • 织梦网站栏目修改教程丝绸之路网站建设意义
  • 如何知道一个网站是谁做的北京装饰公司前十名
  • 杭州网站建设哪个平台好visualstudio 做网站
  • 广州站是哪个站h5建站系统
  • 网站首页网址应该有对应的域名南京高端模板建站
  • 自己做的网站竞价优化怎么做网站流量赚钱吗
  • 人力资源网站建设mip网站模板
  • 太原市住房和城乡建设部网站网站 备案 换空间
  • 怎么做网站备份网站运营数据周报表怎么做
  • 度更新网站做详情页网站
  • 酷炫网站模板wordpress自动发货插件
  • 网站做多个镜像wordpress无法显示向导
  • 交易类网站建设费用工厂招工最新招聘信息
  • 俄语网站建设网站建设的实训报告
  • 朝阳市做网站的公司wordpress msg
  • 企业管理系统免费版seo关于网站
  • 几度设计网站设计制作平板电脑支架
  • 游戏设计 网站上海中企动力做网站多少钱
  • flash 开发的网站网上国网app推广经验
  • pyhton可以做网站吗文章wordpress
  • 省住房城乡建设厅门户网站电子商务网站建设用什么软件
  • 怎么给自己的网站做模版企业网站开发外包
  • 哪家可以做网站东莞网站建设少儿托管