什么是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
答案 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]