Как сначала предоставить аргументы командной строки, а затем флаги в 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)
}