猿问

如何迭代命令行参数并收集标志后剩下的内容?

我的目标是让“init”、“init -site=test”、两个版本的 init 以及独立的“debug”命令在命令行上被接受,并将剩下的任何内容视为文件名。


实际发生的情况是,在“init -site=test”的情况下,由于某种原因,“-site=test”也被接受为文件名。我怎样才能阻止这种情况发生?


package main


import (

    "flag"

    "fmt"

    "os"

)


func main() {

    initCmd := flag.NewFlagSet("init", flag.ExitOnError)

    initSiteName := initCmd.String("site", "", "Main name for your site")

    flag.Parse()

    for pos, cmd := range os.Args {

        switch cmd {

        case "debug":

            fmt.Printf("debug\n")

        case "init":

            initCmd.Parse(os.Args[pos+1:])

            fmt.Printf("init\n  site name:%v\n", *initSiteName)

        default:

            fmt.Printf("Filename: %v\n", cmd);

        }

    }

}


泛舟湖上清波郎朗
浏览 102回答 1
1回答

呼如林

使用该包不是很方便flag。来自文档:标志解析在第一个非标志参数(“-”是非标志参数)之前或终止符“--”之后停止。您必须手动执行此操作:解析后,标志后面的参数可用作切片 flag.Args() 或单独用作 flag.Arg(i)。或者您可以使用另一个包。
随时随地看视频慕课网APP

相关分类

Go
我要回答