我可以使用Go标志添加命令吗?

时间:2017-01-11 19:32:57

标签: go config

我知道我可以定义这样的标志:

initPtr := flag.String("init", "config.json", "Initialize with config filename")

我将这样称呼:

myapp --init=myconfig.json

我想知道我是否可以定义类似命令的内容以便像这样调用应用程序?

myapp init --filename=myconfig.json
myapp check --filename=myconfig.json
myapp run

2 个答案:

答案 0 :(得分:1)

是的,你可以。

请查看https://golang.org/pkg/flag/以获取FlagSet文档。

以及一个工作示例:https://github.com/constabulary/gb/blob/master/cmd/gb/main.go

miltonb要求的一个例子:

int workload[n_threads] = {0, ...};
#pragma omp parallel for schedule(dynamic) private(i)
for(int i=0;i<n;i++){
    //loop code
    workload[omp_get_thread_num()]++;
}

答案 1 :(得分:1)

您可以使用command line argumentsflags的组合来实现这一目标。

例如

configFilePtr := flag.String("filename", "", "Config Filename")
flag.Parse()

n := len(os.Args)
if n > 1 {
    switch os.Args[1] {
        case "init":
            initApp(*configFilePtr)
        case "check":
            checkApp(*configFilePtr)
        case "run":
            runApp()
    }
}

另一种选择是使用类似spf13's cobra的内容。

更新:

如果您需要根据命令使用不同的标记,则可以使用Kare Nuorteva答案中提到的FlagSet

例如

f1 := flag.NewFlagSet("f1", flag.ContinueOnError)
silent := f1.Bool("silent", false, "")
f2 := flag.NewFlagSet("f2", flag.ContinueOnError)
loud := f2.Bool("loud", false, "")

switch os.Args[1] {
  case "apply":
    if err := f1.Parse(os.Args[2:]); err == nil {
      fmt.Println("apply", *silent)
    }
  case "reset":
    if err := f2.Parse(os.Args[2:]); err == nil {
      fmt.Println("reset", *loud)
    }
}

Reference