Go 是否可以将可变参数与标志包的使用结合起来?

Go 是否可以将可变参数与标志包的使用结合起来?,go,Go,我希望我的函数以有效的方式接受可选参数 阅读类似的文章让我想到了variadic args,我正试图将其与flag包一起实现(只是寻找用户能够运行其选择的可用命令行标志的任何替代方案)。。 这是我的标志包用法: func main() { var target string var method string flag.StringVar(&target, "target", "http://google.com/robots.txt", "Target addr

我希望我的函数以有效的方式接受可选参数

阅读类似的文章让我想到了variadic args,我正试图将其与flag包一起实现(只是寻找用户能够运行其选择的可用命令行标志的任何替代方案)。。 这是我的标志包用法:

func main() {
    var target string
    var method string
    flag.StringVar(&target, "target", "http://google.com/robots.txt", "Target address")
    flag.StringVar(&method, "method", "GET", "Method")
    flag.Parse()

    requests.MakeRequest(target, method)
}
这是可变参数函数的一个示例:

func foo(params ...int) {
    fmt.Println(len(params))
}

func main() {
    foo()
    foo(1)
    foo(1, 2, 3)
}
我能把两者结合起来吗?
如果这是不可能的-那么我如何将主程序的用户给定参数传递给变量函数?

您的问题显示了一个误解,变量参数是用于什么的

正如您所意识到的,当函数的参数数量发生变化时,会使用变量。您尝试使用此概念来传递数量可变的已解析命令行参数。这在许多方面都是一个坏主意。显而易见的是,您将命令行参数与代码中的标志和参数的分布相耦合。另一个问题是,可变参数丢失了位置信息。您希望如何识别您收到的5个参数中的哪4个

您应该定义一个结构来保存代码的标志,并编写一个命令行解析器,用于根据默认值和给定的命令行选项填充或创建此结构。 然后使用此结构在整个应用程序中提供标志和选项

实际上,这可能是这样的:

type options struct {
    target string
    method string
}


func main() {
    config := parseCommandLine()
    theRealStuffHappensHere(config)
}

func theRealStuffHappensHere(config options) {
    if config.method == "GET" {
    // ...
    }
}

func parseCommandLine() options {
    var config options
    flag.StringVar(&(config.target), "target", "http://google.com/robotstxt", "Target address")
    flag.StringVar(&(config.method), "method", "GET", "Method")
    flag.Parse()

    return config
}

变量参数在
fmt
包中大量使用,其中所需参数的数量取决于格式字符串中占位符的数量。您的用例不匹配。

将您的标志参数收集到一个片段中,例如
参数:=[]接口{}{target,方法}
或使用
[]string
如果它们都是
string
s,则调用
foo(params…)
。我不明白你想要组合什么。变量函数非常简单:它们作为函数的最后一个参数工作,并且必须是同一类型。以什么方式组合它们?你实际上想在这里做什么?不知道你想要实现什么,答案基本上是肯定的“是的,通过使用它们来做你想做的任何事情"。如中所示-我希望接受标志参数,并仅将用户提供的参数传递给其他函数。如果您的目标是可选位置参数,则更好的方法是接受结构作为函数的参数,并允许未设置字段。谢谢,这对我很有帮助。为将来的查看者编辑:您缺少一个用于eRealStuff func和parseCommandline,在主命令中有一个小l。没问题。我已经更正了示例中的代码。