gpt4 book ai didi

golang 标志在第一个非选项后停止解析

转载 作者:IT王子 更新时间:2023-10-29 00:59:45 25 4
gpt4 key购买 nike

我正在构建一个小的 cli 工具,用于在开发或生产中启动我的应用。

我希望它的工作方式是这样的:

app run --dev or app run --prod

Atm 它确实在我的命令之后但仅在我的命令之前解析标志。所以这有效

app --dev run or app --prod run

任何想法如何解决这个问题,以便我可以在我的命令后使用它?这是我的代码

func main() {
//flag.Usage := usage
flag.Parse()
args := flag.Args()
if len(args) == 0 {
Usage()
os.Exit(0)
}

if *dev {
os.Setenv("ENV", "development")
}

if *prod {
os.Setenv("ENV", "production")
}

switch {
// Run
case args[0] == "run" && len(args) == 1:
os.Setenv("port", *port)
log.Printf("Booting in %s", os.Getenv("ENV"))
Run()

// Help
case args[0] == "help" && len(args) == 1:
Usage()
}
}

最佳答案

传统上,UNIX 选项解析器 getopt() 在第一个非选项后停止解析。 glibc 改变了这种行为以支持任意位置的选项,这是一个有争议的决定。 flag 包实现了传统行为。

您可以做的一件事是在解析标志之前置换参数数组。这就是 glibc 所做的:

func permutateArgs(args []string) int {
args = args[1:]
optind := 0

for i := range args {
if args[i][0] == '-' {
tmp := args[i]
args[i] = args[optind]
args[optind] = tmp
optind++
}
}

return optind + 1
}

此代码排列 args,使选项在前面,程序名称保持不变。 permutateArgs 返回排列后第一个非选项的索引。像这样使用此代码:

optind := permutateArgs(os.Args)
flags.Parse()

// process non-options
for i := range os.Args[optind:] {
// ...
}

关于golang 标志在第一个非选项后停止解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25113313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com