如何在Golang的标志中获取值列表?

Sid*_*han 45 go

什么是Golang相当于下面的python命令?

import argparse
parser = argparse.ArgumentParser(description="something")
parser.add_argument("-getList1",nargs='*',help="get 0 or more values")
parser.add_argument("-getList2",nargs='?',help="get 1 or more values")
Run Code Online (Sandbox Code Playgroud)

我已经看到flag包允许在Golang中进行参数解析.但它似乎只支持String,Int或Bool.如何以这种格式将值列表转换为标志:

go run myCode.go -getList1 value1 value2 
Run Code Online (Sandbox Code Playgroud)

ser*_*jja 102

您可以定义自己的flag.Valueflag.Var()用于绑定它.

这个例子在这里.

然后你可以传递多个标志,如下所示:

go run your_file.go --list1 value1 --list1 value2
Run Code Online (Sandbox Code Playgroud)

UPD:包括代码片段以防万一.

package main

import "flag"

type arrayFlags []string

func (i *arrayFlags) String() string {
    return "my string representation"
}

func (i *arrayFlags) Set(value string) error {
    *i = append(*i, value)
    return nil
}

var myFlags arrayFlags

func main() {
    flag.Var(&myFlags, "list1", "Some description for this param.")
    flag.Parse()
}
Run Code Online (Sandbox Code Playgroud)

  • 我意识到这已经3年了,但这并没有完全回答原来的问题.您可以通过这种方式使用重复标记,但据我所知,您无法执行原始期望:具有多个值的单个标记调用.这是一个非常基本的标志操作,我拒绝相信Go不允许它在标准库中 (4认同)
  • @KoalaBear带有多个值的单个标志调用的问题是不明确的.相同的语法通常意味着单个标志调用具有单个值,后跟单个[参数](https://golang.org/pkg/flag/#Arg).我认为这个答案的解决方案是你能想到的最好的解决方案. (3认同)
  • +1。如果您想在一个逗号分隔的字符串中指定所有列表元素,也可以使用 flag.Value() 方法,而 Value() 可以将其拆分为一个字符串的切片。`flag.Value` 和 `flag.Var()` 比仅仅使用 `flag.String()` 和 `strings.Split()` 更通用。`Value()` 报告的错误也由包 `flag` 自动处理。 (2认同)
  • 谢谢,那行得通!但是是否可以通过这种方式实现它:去运行 my_file.go --list1 value1 value2 (2认同)
  • 这是一个非常棒的建议,从官方文档中完全看不出来。我希望有+10。请考虑将此添加到官方文档中。 (2认同)

Pyl*_*nux 15

通过使用该flag.Args()函数,您至少可以在命令的末尾有一个参数列表。

package main

import (
    "flag"
    "fmt"
)

var one string

func main() {
    flag.StringVar(&one, "o", "default", "arg one")
    flag.Parse()
    tail := flag.Args()
    fmt.Printf("Tail: %+q\n", tail)
}
Run Code Online (Sandbox Code Playgroud)

my-go-app -o 1 this is the rest 将打印 Tail: ["this" "is" "the" "rest"]


fuz*_*fuz 8

使用flag.String()获取所需参数的整个值列表,然后使用strings.Split()将其拆分为单个项目.

  • @Alex Medveshchek 这是解析选项参数的一种超级糟糕的方式,因为在它们之后不能轻易拥有操作数。此外,它违反了 UCB 实用程序指南,这也是一件坏事。 (5认同)
  • @AlexMedveshchek如果选项的参数用空格真正分隔(例如,如果你键入`foo -opt"1 2 3"`),那么它当然有效.如果你将它们作为单独的参数传递给程序(即如果你输入`foo -opt 1 2 3`)那么它当然根本无法工作,即使使用其他策略,因为你无法区分选项的参数跟随它的其他操作数.不要那样写程序. (4认同)
  • 是的,你是对的,你可以用引号输入 `"1 2 3"`,它会起作用。但它是人为的,最初的问题是如何像在 python 的 `argparse` 中实现的那样实现参数解析,它允许解析提到的案例。事实上,它真的很容易实现:你只需要使用 `-opt` 的参数,直到你遇到一些其他已知的选项,比如 `-opt2` 或命令行中的最后一个参数。 (2认同)
  • @AlexMedveshchek [相关准则](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_01)。 (2认同)