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,但从长远来看它使其更加可用和可维护.
我不会推荐这个.(ab)使用可变参数传递可选参数存在不同的问题.其中最重要的可能是最后arg ...T)一种形式只允许一种类型.对于具有多个类型的多个可选参数,可以使用...interface{}但是这会导致不必要的运行时(un)装箱成本并且缺少任何(有用的)编译时类型检查.
另一个可能的反对意见是,我认为你不会在标准库中的任何地方找到一个示例/先例,这被一些人认为是非正式的Go编码风格指南.
| 归档时间: |
|
| 查看次数: |
341 次 |
| 最近记录: |