Merungkai Parameter Variadik dalam Fungsi Pembungkus
Fungsi variadik dalam Go memainkan peranan penting dalam menerima bilangan hujah yang sewenang-wenangnya. Untuk menggunakan ciri ini dengan berkesan, adalah penting untuk memahami cara parameter ini dikendalikan.
Pertimbangkan contoh fungsi pembungkus fmt.Fprintf:
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
Apabila menggunakan fungsi ini dengan Die(" foo"), keluaran yang agak tidak dijangka muncul: foo%!(EXTRA []antara muka {}=[]). Akhiran yang membingungkan ini boleh dikaitkan dengan cara parameter variadik dihantar.
Mengikut reka bentuk, fungsi variadik menerima hujah sebagai kepingan jenis masing-masing. Dalam kes ini, fungsi Die menerima kepingan []antara muka{} bernama args. Walau bagaimanapun, apabila kemudiannya menghantar hujah ini kepada fmt.Sprintf, ia dianggap sebagai entiti tunggal jenis []antara muka{}, dan bukannya nilai individu yang dimaksudkan.
Untuk membetulkannya, sintaks ... hendaklah digunakan seperti yang dilihat di bawah:
str := fmt.Sprintf(format, args...)
Menggunakan pendekatan ini memastikan bahawa setiap nilai dalam args dihantar ke fmt.Sprintf sebagai hujah yang berasingan, meniru tingkah laku apabila menerimanya dalam fungsi Die. Perbezaan penting ini sejajar dengan spesifikasi bahasa Go dan menjamin output yang dijangkakan.
Atas ialah kandungan terperinci Mengapakah `fmt.Sprintf` menghasilkan output yang tidak dijangka apabila menggunakan parameter variadic dalam fungsi pembalut?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!