如果我有一个函数,其中最后一个参数是可选的,那么使用适当的做法...允许该参数是可选的还是不正确的形式?例子: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编码风格指南。
慕娘9325324
TA贡献1783条经验 获得超4个赞
如果确实需要可选参数(从Go stdlib中可以看到,这种情况很少见),惯用的方法是为每个可选参数定义一个带有字段的结构,然后调用者可以将带有字段的结构文字传递给他们想要填写。
更常见的是在大多数情况下只有一个或两个“可选”参数时提供替代函数或方法。
像Python这样的语言中的可选参数通常意味着,API会不断增长,直到函数和方法具有的参数超出任何人都无法记住的程度为止,而且永远不清楚不清楚各种参数组合如何相互作用(并且甚至未经测试)。
强迫您为各种参数组合定义显式函数和方法需要对API进行更深入的了解,但从长远来看,它将更加有用和可维护。
- 3 回答
- 0 关注
- 164 浏览
添加回答
举报
0/150
提交
取消