防止flag.Parse()吞下“–”?

是否有可能防止flag.Parse()从“吞”(拆除)--flag.Args()

例子

package main

import (
    "flag"
    "fmt"
)

func main() {
    flag.Parse()
    fmt.Println(flag.Args())
}

我无法区分这两个调用:

$ go run . hello
[hello]

$ go run . -- hello
[hello]

为什么我要区分这两个调用?

我正在编写一个封装另一个子程序的 Go 程序。

我的程序有一些可选的位置参数

myprog [options] [ARG1 ARG2 ...] [-- SUBARG1 SUBARG2...]
myprog [options] [ARG1 ARG2 ...] [-- SUBARG1 SUBARG2...]

调用示例:

我知道我可以---用作分隔符或任何其他组合,但我只是想知道这个--论点。

接受答案后编辑

来源:

$ myprog -flag1 val1

$ myprog -flag1 val1 foo
# foo is for myprog

$ myprog -flag1 val1 foo -- bar
# foo is for myprog
# bar is for the subprogram

$ myprog -flag1 val1 -- bar
# bar is normally for the subprogram, BUT flag.Args() = ["bar"] so I have no way to know that it was after "--"

全部测试成功!

package main

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

func main() {
    var initFlag = flag.Bool("init", false, "init")
    var subArgs []string
    for i := len(os.Args) - 1; i > 0; i-- {
        if os.Args[i] == "--" {
            subArgs = os.Args[i+1:]
            os.Args = os.Args[:i]
            break
        }
    }
    flag.Parse()
    fmt.Println(*initFlag)
    fmt.Println(flag.Args())
    fmt.Println(subArgs)
}

回答

标志包没有禁用标志终止符的选项--

在调用之前从主程序参数中拆分子程序参数flag.Parse()

var subArgs []string
for i := len(os.Args) - 1; i > 0; i-- {
    if os.Args[i] == "--" {
        subArgs = os.Args[i+1:]
        os.Args = os.Args[:i]
        break
    }
}
flag.Parse()

  • @Peter : I did some tests with `go run` and it worked without any trouble.

以上是防止flag.Parse()吞下“–”?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>