Mengapakah `fmt.Sprintf` menghasilkan output yang tidak dijangka apabila menggunakan parameter variadic dalam fungsi pembalut?

Patricia Arquette
Lepaskan: 2024-11-16 07:59:03
asal
936 orang telah melayarinya

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

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)
}
Salin selepas log masuk

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...)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan