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

时间:2015-02-04 13:46:35

标签: 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")

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

go run myCode.go -getList1 value1 value2 

4 个答案:

答案 0 :(得分:83)

您可以定义自己的flag.Value并使用flag.Var()进行绑定。

示例是here

然后你可以传递如下的多个标志:

go run your_file.go --list1 value1 --list1 value2

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()
}

答案 1 :(得分:6)

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

答案 2 :(得分:2)

通过使用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)
}

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

答案 3 :(得分:1)

如果命令行末尾有一系列整数值,则此辅助函数将正确地将它们转换并将它们放在int s的切片中:

package main

import (
    "flag"
    "fmt"
    "strconv"
)

func GetIntSlice(i *[]string) []int {
    var arr = *i
    ret := []int{}
    for _, str := range arr {
        one_int, _ := strconv.Atoi(str)
        ret = append(ret, one_int)
    }
    return ret
}

func main() {
    flag.Parse()
    tail := flag.Args()
    fmt.Printf("Tail: %T,  %+v\n", tail, tail)
    intSlice := GetIntSlice(&tail)

    fmt.Printf("intSlice: %T,  %+v\n", intSlice, intSlice)

}

mac:demoProject sx$ go run demo2.go 1 2 3 4
Tail: []string,  [1 2 3 4]
intSlice: []int,  [1 2 3 4]