如何在golang中先提供命令行参数,然后提供标志?

Moh*_*hit 5 go flag-go

如果提供的输入采用以下形式,Golang 的标志包会正确读取命令行标志和参数:go run main.go -o filename.txt arg1 arg2

但如果我尝试提供像 : 这样的输入go run main.go arg1 arg2 -o filename.txt,则 main.go 之后的所有内容都会被读取为参数。

如何让这种风格发挥作用?

我的程序:

package main

import (
    "flag"
    "fmt"
)

func main() {

    var output string
    flag.StringVar(&output, "o", "", "Writes output to the file specified")
    flag.Parse()
    fmt.Println("Positional Args : ", flag.Args())
    fmt.Println("Flag -o : ", output)
}
Run Code Online (Sandbox Code Playgroud)

go run main.go -o filename.txt arg1 arg2

输出:

Positional Args :  [arg1 arg2]
Flag -o :  filename.txt
Run Code Online (Sandbox Code Playgroud)

go run main.go arg1 arg2 -o filename.txt

输出:

Positional Args :  [arg1 arg2 -o filename.txt]
Flag -o :
Run Code Online (Sandbox Code Playgroud)

Vor*_*ung 3

如果你摆弄 os.Args 的内容,则可以接受arg1 arg2 -o filename.txt

在for循环中遍历从命令行传入的os.Args

如果看到 - 则设置一个条件来指示已看到第一个标志

如果条件已设置,则填充“notargs”列表。否则,填充“args”列表

这里有一点额外的复杂性,因为用于将 os.Args 设置为将执行标志处理的值的 args 列表必须包含程序名称(原始 os.Arg[0])作为第一个值

该解决方案不适用于-o filename.txt arg1 arg2

package main

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

func main() {

    var output string
    var args[]string
    var notargs[]string
    var in_flags bool=false
    for i:=0; i<len(os.Args); i++ {
      if os.Args[i][0]=='-' {
       in_flags=true
      }
      if i==0 || in_flags {
        notargs=append(notargs,os.Args[i])
      } else {
        args=append(args,os.Args[i])
      }
    }
    os.Args=notargs
    flag.StringVar(&output, "o", "", "Writes output to the file specified")
    flag.Parse()
    fmt.Println("args ",args)
    fmt.Println("Flag -o : ", output)
}
Run Code Online (Sandbox Code Playgroud)