Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Saya Boleh Mendapatkan Sepotong Bait daripada Rentetan dalam Go Tanpa Menyalin Memori?

Bagaimanakah Saya Boleh Mendapatkan Sepotong Bait daripada Rentetan dalam Go Tanpa Menyalin Memori?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 10:59:02757semak imbas

How Can I Retrieve a Byte Slice from a String in Go Without Memory Copying?

Mengambil Sekeping Bait daripada Rentetan tanpa Salinan Memori menggunakan Tidak Selamat

Masalah:

Anda perlu menukar rentetan kepada kepingan bait tanpa menanggung penalti prestasi salinan memori, terutamanya untuk mengendalikan set data yang besar.

Jawapan:

Langkah 1: Fahami Salinan Memori Isu

String dalam Go tidak boleh diubah, bermakna ia tidak boleh diubah suai di tempatnya. Oleh itu, menukar rentetan kepada kepingan bait menggunakan sintaks []bait(rentetan) menghasilkan salinan memori.

Langkah 2: Menggunakan Tidak Selamat

Untuk mengelakkan ingatan menyalin, operasi yang tidak selamat boleh digunakan. Fungsi Rentetan tidak selamat boleh digunakan untuk mendapatkan penuding kepada data rentetan asas.

<code class="go">import "unsafe"

func unsafeGetBytes(s string) []byte {
    return (*[0x7fff0000]byte)(unsafe.Pointer(
        (*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
    )[:len(s):len(s)]
}</code>

Penjelasan:

  • Fungsi rentetan tidak selamat mengembalikan a penunjuk kepada data rentetan.
  • Penunjuk dilemparkan ke tatasusunan bait yang besar ([0x7fff0000]bait). Go membenarkan penghantaran yang tidak selamat ke tatasusunan saiz yang tidak ditentukan.
  • Tatasusunan kemudiannya digunakan untuk membuat kepingan bait dengan panjang yang sama dengan rentetan.

Pertimbangan Tambahan:

Memampatkan set data yang besar menggunakan gzip berkemungkinan akan membayangi keuntungan prestasi daripada mengelakkan salinan memori.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Sepotong Bait daripada Rentetan dalam Go Tanpa Menyalin Memori?. 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