Как сначала предоставить аргументы командной строки, а затем флаги в golang?

Пакет флагов Golang правильно считывает флаги и аргументы командной строки, если предоставленный ввод имеет форму:

Но если я попытаюсь предоставить ввод, например : , все после 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)
}

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

Выход:

      Positional Args :  [arg1 arg2]
Flag -o :  filename.txt

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

Выход:

      Positional Args :  [arg1 arg2 -o filename.txt]
Flag -o :

1 ответ

Если вы покопаетесь в содержимом os.Args, можно принять arg1 arg2 -o filename.txt

Пройдите через os.Args, который передается из командной строки в цикле for

Если виден -, установите условие, указывающее, что был замечен первый флаг.

Если условие установлено, заполните список «notargs». В противном случае заполните список «args».

Здесь есть некоторые дополнительные сложности, поскольку список аргументов, который используется для установки os.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)
}
Другие вопросы по тегам