Fungsi variadik dalam Go menerima bilangan argumen yang berubah-ubah, yang disimpan sebagai kepingan jenis yang ditentukan. Apabila memanggil fungsi variadic, adalah penting untuk memahami cara hujah dihantar.
Pertimbangkan kod berikut yang cuba membuat pembalut di sekeliling fmt.Fprintf dengan argumen panjang boleh ubah:
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
Apabila memanggil Die("foo"), output mengandungi "%%!(EXTRA []antara muka {}=[])" yang tidak dijangka.
Isu timbul daripada menghantar kepingan args terus ke fmt.Sprintf. Untuk menghantar argumen secara individu dengan betul, pengendali elipsis ... mesti digunakan:
package main import ( "fmt" "os" ) func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args...) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) } func main() { Die("foo") }
Dengan menggunakan ..., setiap elemen hirisan args dihantar sebagai argumen berasingan kepada fmt.Sprintf, menyelesaikan mengeluarkan dan menghasilkan output yang dijangkakan:
foo
Atas ialah kandungan terperinci Mengapa Pembungkus fmt.Fprintf Saya Mencetak Output Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!