我知道我可以定义这样的标志:
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
答案 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 arguments和flags的组合来实现这一目标。
例如
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)
}
}