Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan Pengagihan Semula Memori dalam Fungsi Pembungkus Variadic?

Bagaimana untuk Mengelakkan Pengagihan Semula Memori dalam Fungsi Pembungkus Variadic?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 18:19:02660semak imbas

How to Avoid Memory Reallocation in Variadic Wrapper Functions?

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!

Kenyataan:
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