解析包裝函數中的可變參數
Go 中的可變參數在接受任意數量的參數方面發揮著至關重要的作用。要有效地利用此功能,必須了解如何處理這些參數。
考慮fmt.Fprintf 包裝函數的範例:
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
使用Die(" 呼叫此函數時foo"),出現相當意外的輸出:foo%!(EXTRA []interface {}=[])。這個令人困惑的後綴可以歸因於可變參數的傳遞方式。
根據設計,可變參數函數將參數作為各自類型的切片接收。在本例中,Die 函式接受一個名為 args 的 []interface{} 切片。但是,當隨後將此參數傳遞給 fmt.Sprintf 時,它被視為 []interface{} 類型的單一實體,而不是預期的單一值。
要修正此問題,... 語法應該是使用如下所示:
str := fmt.Sprintf(format, args...)
使用此方法可確保args 中的每個值都作為單獨的參數傳遞給fmt .Sprintf,模仿在Die 函數中接收它們時的行為。這一關鍵區別符合 Go 語言規範並保證了預期的輸出。
以上是為什麼在包裝函數中使用可變參數時「fmt.Sprintf」會產生意外的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!