首頁  >  文章  >  後端開發  >  為什麼在包裝函數中使用可變參數時「fmt.Sprintf」會產生意外的輸出?

為什麼在包裝函數中使用可變參數時「fmt.Sprintf」會產生意外的輸出?

Patricia Arquette
Patricia Arquette原創
2024-11-16 07:59:03934瀏覽

Why does `fmt.Sprintf` produce unexpected output when using a variadic parameter in a wrapper function?

解析包裝函數中的可變參數

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn