猿问

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

如果我有一个函数,其中最后一个参数是可选的,那么使用适当的做法...允许该参数是可选的还是不正确的形式?


例子:


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"

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


UYOU
浏览 165回答 3
3回答

繁花不似锦

我不会推荐这个。(ab)使用可变参数传递可选参数有不同的问题。其中最重要的可能是后一种形式arg ...T)仅允许一种类型。对于一个以上具有多个类型的可选参数,可以使用一个参数,...interface{}但是这会导致不必要的运行时(取消装箱)成本,并且缺少任何(usefull)编译时类型检查。另一个可能的反对意见是,我认为您不会在标准库中的任何地方找到该示例/先例,有些人将其视为非正式的Go编码风格指南。

慕娘9325324

如果确实需要可选参数(从Go stdlib中可以看到,这种情况很少见),惯用的方法是为每个可选参数定义一个带有字段的结构,然后调用者可以将带有字段的结构文字传递给他们想要填写。更常见的是在大多数情况下只有一个或两个“可选”参数时提供替代函数或方法。像Python这样的语言中的可选参数通常意味着,API会不断增长,直到函数和方法具有的参数超出任何人都无法记住的程度为止,而且永远不清楚不清楚各种参数组合如何相互作用(并且甚至未经测试)。强迫您为各种参数组合定义显式函数和方法需要对API进行更深入的了解,但从长远来看,它将更加有用和可维护。

呼如林

这完全取决于您的项目要求,如果您的项目处于这种情况下,那么就不会有任何不好的形式仅在这种情况下才提供可选参数功能。
随时随地看视频慕课网APP

相关分类

Go
我要回答