变量函数是可选参数的合适解决方案吗?

I H*_*azy 1 optional-parameters go

如果我有一个函数,其中最后一个参数是可选的,是否适当的做法...是允许参数是可选的,还是被认为是错误的形式?

例:

func Foo(s ...string) {
    switch len(s) {
        case 0:
            fmt.Println("You didn't pass an argument")
        case 1:
            fallthrough
        default:
            fmt.Printf("You passed %s\n", s[0])
    }
}

Foo("bar")        // "You passed bar"
Foo()             // "You didn't pass an argument"
Foo("bar", "baz") // "You passed bar"
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我不在乎是否传递了太多的参数,但是default:在需要的时候我可以处理它.

uri*_*iel 12

如果你真的需要可选参数(正如你从Go stdlib中看到的那样很少见),那么惯用的方法是为每个可选参数定义一个包含字段的结构,然后调用者可以传递带有字段的结构文字他们想要填补.

更常见的是提供替代函数或方法,当它只有一个或两个"可选"参数时,应该是大部分时间.

像Python这样的语言中的可选参数通常意味着API的增长和增长直到函数和方法具有比任何人都记不得的更多的参数,并且从不清楚各种参数组合如何交互(并且它们甚至更少测试).

强制您为各种参数组合定义显式函数和方法需要更多地考虑您的API,但从长远来看它使其更加可用和可维护.


zzz*_*zzz 5

我不会推荐这个.(ab)使用可变参数传递可选参数存在不同的问题.其中最重要的可能是最后arg ...T)一种形式只允许一种类型.对于具有多个类型的多个可选参数,可以使用...interface{}但是这会导致不必要的运行时(un)装箱成本并且缺少任何(有用的)编译时类型检查.

另一个可能的反对意见是,我认为你不会在标准库中的任何地方找到一个示例/先例,这被一些人认为是非正式的Go编码风格指南.