/flag

Primary LanguageGo

flag

示例

module db

package cache

import "github.com/go-redis/redis/v8"
import "flag"

var Db redis.Client

var g_redis_addr = flag.String("redis-addr", "redis://user:pwd@127.0.0.1:6379/db",  "redis address")
var g_timeout = flag.Int("redis-timeout", 100, "redis operator timeout")

func init()  {
	opt, err := redis.ParseURL(*g_redis_addr)
	if err != nil {
		panic(err)
	}
	Db = redis.NewClient(opt);
}

func Get(key string, val interface{}) error {
	.....
}

上面的代码会出错, 因为flag 变量的初始化是在flag.Parse 的时候, flag.Parse 只能在所有变量都定义完了才能调用,init 函数这个时候还不能获取到flag真正的值。

golang 的 package 就是module, import 表明模块之间的依赖。如果不用flag, 他们的依赖关系是对的,初始化顺序也是对的,一切都很美好。 一旦你的模块需要可配置, 事情就麻烦起来了。

这个库会先初始化自己, 当用flag.String, flag.StringVar 定义变量的时候, 直接获取到值;这样就没有破坏标准的flag接口, 只是改变初始化顺序

选项

  • flagenv[=true]

    flag 从 .env 文件和环境变量中获取flag配置项, 微服务12条建议把环境当成配置; k8s环境下运行, 可以把ConfigMap 映射成环境变量

  • flagfile[=flagfile]

    读取 flagfile 配置文件; 用户指定文件名的时候,可以根据文件后缀选择不同的解析器, 支持 Yaml, Toml, Json, Jsonnet, Ini, env, flagfile格式; 支持读取多个文件配置文件(使用逗号分隔多个文件) - 从标准输入中读取, 格式是json

  • flagdump[=flag|json|yaml|toml|ini|env]

    输出flag的默认值