如果我有一個函數,其中最后一個參數是可選的,那么使用適當的做法...允許該參數是可選的還是不正確的形式?例子: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 關注
- 194 瀏覽
添加回答
舉報
0/150
提交
取消