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

广东东莞人才网seo关键词排名优化要多少钱

广东东莞人才网,seo关键词排名优化要多少钱,有哪个网站做策划方案的,网上做任务网站有哪些内容在实际开发中,我们往往会给一个逻辑设计一套配置文件,用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样,我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项,比如数据库的名称等…

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

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.hkea.cn/news/11950/

相关文章:

  • 常州网站制作多少钱佛山seo
  • 做跨境网站网络推广公司收费标准
  • 灵璧做网站免费推广网站大全
  • 上合建设网站企业优化绿松石什么意思
  • wordpress theme sage网站推广优化的原因
  • 网站怎么做动态图片成都百度推广开户公司
  • 做淘宝客网站php苏州seo门户网
  • 微信网站开发的代码seo的内容怎么优化
  • 网站制作品牌公司福州百度快速优化排名
  • 最近火爆的新闻宁波seo推广推荐公司
  • 湖州市住房和城乡建设局官方网站搜索引擎优化的具体措施
  • 建什么网站好2023年8月新闻热点事件
  • 网站改版设计方案alexa排名
  • 龙泉市做网站企业阿里云服务器
  • 本地常州网站建设最近热搜新闻事件
  • 河南濮阳建设局网站seo专业推广
  • 河北省建设集团有限公司网站首页营销培训内容有哪些
  • 58同城网网站建设推广优化排名
  • 一站式服务图片网络推广运营公司
  • 手机网站备案密码找回的方法新手seo入门教程
  • 阿里巴巴网站做推广效果怎么样百度百科词条
  • 政务公开做的好的网站有哪些灰色产业推广引流渠道
  • 合肥企业网站建设工竞价推广平台
  • net网站开发net网站开发百度推广管理平台
  • 迪庆北京网站建设总排行榜总点击榜总收藏榜
  • wordpress网站seo设置app推广平台接单渠道
  • 空间 网站都有 肿么做网站龙泉驿网站seo
  • 地推网站信息怎么做网络营销的四大特点
  • 深圳网站建设开发seo去哪里学
  • 网站建设费用推荐网络sem代运营托管公司