为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
UYOU 2021-05-09 14:13:44
如果我有一个函数,其中最后一个参数是可选的,那么使用适当的做法...允许该参数是可选的还是不正确的形式?例子: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:在需要时处理。
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2021-05-17
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

如果确实需要可选参数(从Go stdlib中可以看到,这种情况很少见),惯用的方法是为每个可选参数定义一个带有字段的结构,然后调用者可以将带有字段的结构文字传递给他们想要填写。

更常见的是在大多数情况下只有一个或两个“可选”参数时提供替代函数或方法。

像Python这样的语言中的可选参数通常意味着,API会不断增长,直到函数和方法具有的参数超出任何人都无法记住的程度为止,而且永远不清楚不清楚各种参数组合如何相互作用(并且甚至未经测试)。

强迫您为各种参数组合定义显式函数和方法需要对API进行更深入的了解,但从长远来看,它将更加有用和可维护。


查看完整回答
反对 回复 2021-05-17
?
呼如林

TA贡献1798条经验 获得超3个赞

这完全取决于您的项目要求,如果您的项目处于这种情况下,那么就不会有任何不好的形式

仅在这种情况下才提供可选参数功能。


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信