Pembungkus Variadik tanpa Alokasi Semula Memori
Fungsi variadik memberikan fleksibiliti dalam pengendalian parameter, tetapi menambahkan item pada fungsi pembungkus boleh mencetuskan pengagihan semula memori. Artikel ini meneroka penyelesaian untuk mengelakkan isu ini sambil mengekalkan kemudahan penyahpepijatan.
Satu pendekatan biasa untuk mencipta pembalut variadik ialah dengan terus menghantar hujah kepada fungsi dalaman:
<code class="go">func Debug(a ...interface{}) { if debug { fmt.Fprintln(out, prefix, sep, a...) } }</code>
Walau bagaimanapun, ini boleh membawa kepada ralat "terlalu banyak hujah". Pendekatan lain ialah menggunakan vararg untuk membungkus argumen, tetapi ini menghasilkan ralat "senarai nama tidak dibenarkan dalam jenis antara muka."
Penyelesaian yang nampaknya sah adalah dengan mencipta kepingan sementara dan memasukkan awalan, pemisah, dan hujah ke dalamnya:
<code class="go">func Debug(a ...interface{}) { if debug { sl := make([]interface{}, len(a)+2) sl[0] = prefix sl[1] = sep for i, v := range a { sl[2+i] = v } fmt.Fprintln(out, sl...) } }</code>
Walaupun ini berfungsi, ia melibatkan peruntukan memori yang tidak perlu.
Tambah sebagai Penyelesaian Slick
Lebih cekap pendekatan adalah untuk menggunakan fungsi append. Dengan menambahkan awalan dan pemisah pada argumen asal, kita boleh mengelakkan pengagihan semula memori:
<code class="go">func Debug(a ...interface{}) { if debug { fmt.Fprintln(out, append([]interface{}{prefix, sep}, a...)...) } }</code>
Pelapik satu ini dengan berkesan menambahkan awalan dan pemisah kepada argumen variadic tanpa membuat kepingan baharu. Ia ringkas, cekap dan menyelesaikan isu peruntukan memori tanpa menjejaskan kefungsian pembalut variadic.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Pengagihan Semula Memori dalam Fungsi Pembungkus Variadic?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!