flag欠缺的

简单情形下,无需自行命令行parser或第三方包,内建的flag包即可很好的完成工作

但与命令行Parser的事实标准:Posix getopt(C/C++/Perl/Shell脚本都可用)相比,还有较大差距

  1. 无法区分 long option 和 short option,如:-h 和 –help
  2. 不支持short options合并,如:ls -l -h <=> ls -hl
  3. 命令行标志的位置不能任意放置,如无法放在 non-flag parameter 后面

一个良好的应用配置层次

  1. 程序内置初始默认值
  2. 配置文件的配置项值可覆盖(override)程序内置默认值
  3. 命令行选项和参数值具有最高优先级,可以override前两层的值

TOML,Go配置文件的事实标准(可能不能得到认同)

Java 配 xml,ruby 配 yaml,windows 配 ini,Go 的搭配组合,TOML

Age = 25
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z

配置文件可直接解析成一个golang struct

type Config struct {
  Age int
  Cats []string
  Pi float64
  Perfection []int
  DOB time.Time
}

解析步骤很简单

var conf Config
if _, err := toml.Decode(tomlData, &conf); err != nil {
  // handle error
}

toml 欠缺的

  • 映射结果体字段没有初始值
  • 内建flag包没有将命令行参数值解析为一个go结构体,而是零散的变量