防止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.