一个简单的go语言配置文件库,将YAML配置自动映射到实体中, 相似与spring-boot配置文件。 会从根实体strut遍历实体属性,若是类型为bool, string, 整型, 浮点型,map[string]interface{},[]interface{}, 则会根据tag中的profile
值(不设置则为当前属性名的首字母变小写)解析YAML或flag或环境变量,并赋值; 若YAML或flag或环境变量都不存在,则使用tag中的profileDefault
设置默认值; 若默认值也未设置,则返回error。默认变量优先级:环境变量 > flag参数 > YAML > profileDefault默认值, 能够经过设置envHigher未false,让flag优先级 > 环境变量。 注意:接收类型和返回类型都须要为指针类型。git
eureka: instance: preferIpAddress: true leaseRenewalIntervalInSeconds: 10 leaseExpirationDurationInSeconds: 30 client: serviceUrl: defaultZone: http://localhost:8000/eureka/ registryFetchIntervalSeconds: 10 logging: level: github.com/flyleft/consul-iris/pkg/config: info github.com/flyleft/consul-iris/pkg/route: debug 复制代码
type SingleEnv struct { Eureka SingleEureka Logging map[string]interface{} `profile:"logging.level" profileDefault:"{\"github.com/flyleft/consul-iris\":\"debug\"}"` } type SingleEureka struct { PreferIpAddress bool `profile:"instance.preferIpAddress"` LeaseRenewalIntervalInSeconds int32 `profile:"instance.leaseRenewalIntervalInSeconds"` LeaseExpirationDurationInSeconds uint `profile:"instance.leaseExpirationDurationInSeconds"` ServerDefaultZone string `profile:"client.serviceUrl.defaultZone" profileDefault:"http://localhost:8000/eureka/"` RegistryFetchIntervalSeconds byte `profile:"client.registryFetchIntervalSeconds"` } //使用 func main() { env, err := Profile(&SingleEnv{}, "test-single-profile.yml", true) if err != nil { t.Error("Profile execute error", err) } trueEnv := env.(*SingleEnv) } //经过环境变量覆盖配置,好比设置EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS环境变量值覆盖eureka.instance.leaseRenewalIntervalInSeconds 复制代码
profiles: active: dev # 设置生效的profile dev: database: username: root password: root eureka: zone: http://localhost:8000/eureka/ fetchInterval: 10 logging: level: github.com/flyleft/consul-iris/pkg/config: info github.com/flyleft/consul-iris/pkg/route: debug production: database: username: production password: production eureka: zone: http://localhost:8000/eureka/ fetchInterval: 10 logging: level: github.com/flyleft/consul-iris/pkg/config: info github.com/flyleft/consul-iris/pkg/route: debug 复制代码
type Eureka struct { Zone string `profile:"zone"` FetchInterval int `profile:"fetchInterval"` } type DataSource struct { Host string `profile:"host" profileDefault:"localhost"` Username string `profile:"username"` Password string `profile:"password"` } type MultiEnv struct { DataSource DataSource `profile:"database"` Eureka Eureka Logging map[string]interface{} `profile:"logging.level" profileDefault:"{\"github.com/flyleft/consul-iris\":\"debug\"}"` Users []interface{} `profile:"users" profileDefault:"[\"admin\",\"test\",\"root\"]"` } func main() { env, err := Profile(&MultiEnv{}, "test-multi-profile.yml", true) if err != nil { t.Error("Profile execute error", err) } trueEnv := env.(*MultiEnv) } //可经过环境变量DEV_EUREKA_ZONE覆盖eureka.zone的值 复制代码