我可以添加带有Go标志的命令吗?

我可以添加带有Go标志的命令吗?,go,config,Go,Config,我知道我可以这样定义标志: initPtr := flag.String("init", "config.json", "Initialize with config filename") myapp --init=myconfig.json 我会这样称呼它: initPtr := flag.String("init", "config.json", "Initialize with config filename") myapp --init=myconfig.json 我想知道我是否

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

initPtr := flag.String("init", "config.json", "Initialize with config filename")
myapp --init=myconfig.json
我会这样称呼它:

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
是的,你可以

请查看标记集文档

例如:

还有一个miltonb要求的例子:

% go run flagset.go init --filename=foo.json foo bar
init foo.json [foo bar]
% go run flagset.go check --filename=bar.json 1 2 3
check bar.json [1 2 3]
% go run flagset.go run
run
% cat flagset.go
package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    init := flag.NewFlagSet("init", flag.ExitOnError)
    initFile := init.String("filename", "myconfig.json", "configuration file")

    check := flag.NewFlagSet("check", flag.ExitOnError)
    checkFile := check.String("filename", "myconfig.json", "configuration file")

    if len(os.Args) <= 1 {
        flag.Usage()
        os.Exit(1)
    }

    switch os.Args[1] {
    case "init":
        if err := init.Parse(os.Args[2:]); err == nil {
            fmt.Println("init", *initFile, init.Args())
        }
    case "check":
        if err := check.Parse(os.Args[2:]); err == nil {
            fmt.Println("check", *checkFile, check.Args())
        }
    case "run":
        fmt.Println("run")
    }
}
%go run flagset.go init--filename=foo.json foo bar
init foo.json[foo-bar]
%go run flagset.go check--filename=bar.json 1 2 3
check bar.json[1 2 3]
%快跑旗手,快跑
跑
%猫旗手,开始
包干管
进口(
“旗帜”
“fmt”
“操作系统”
)
func main(){
init:=flag.NewFlagSet(“init”,flag.ExitOnError)
initFile:=init.String(“文件名”、“myconfig.json”、“配置文件”)
检查:=flag.NewFlagSet(“检查”,flag.ExitOnError)
checkFile:=check.String(“文件名”、“myconfig.json”、“配置文件”)

如果len(os.Args)您可以使用和的组合来实现

例如

另一种选择是使用类似的方法

更新:

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

例如


如果您添加一个关于实现工作原理的小示例,那将非常酷。请注意,有些保留标志您无法覆盖。如果我记得的话,“build”和“help”是两个这样的标志。“Run”可能是另一个。