Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyalin Rentetan Go dengan Selamat ke C char* Penunjuk menggunakan CGO?

Bagaimana untuk Menyalin Rentetan Go dengan Selamat ke C char* Penunjuk menggunakan CGO?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 12:17:15584semak imbas

How to Safely Copy Go Strings to C char* Pointers using CGO?

Menyalin Go Strings ke C char* Penunjuk menggunakan CGO

Di alam Go, anda mungkin menghadapi situasi di mana anda perlu bertukar dengan lancar data antara kod Go anda dan perpustakaan atau aplikasi C. Satu senario sedemikian ialah pemindahan rentetan Go ke penunjuk aksara C (char *) menggunakan kuasa CGO.

Cabaran:

Timbul keinginan untuk menyalin Go rentetan ke dalam aksara * melalui keupayaan ajaib CGO. Persoalannya berlarutan: bolehkah ini dicapai menggunakan pendekatan berikut?

func copy_string(cstr *C.char) {
    str := "foo"
    C.GoString(cstr) = str
}

Penyelesaian:

Walaupun niatnya murni, pendekatan yang dibentangkan dalam coretan kod jatuh pendek. Menurut dokumentasi rasmi CGO, kaedah yang betul untuk menukar rentetan Go kepada rentetan C melibatkan penggunaan fungsi C.CString:

cstr = C.CString(str)

Adalah penting untuk diingat bahawa C.CString dengan terpaksa memperuntukkan memori untuk awak. Walau bagaimanapun, ia tidak melepaskan memori ini secara automatik, menyerahkannya kepada usaha gigih anda. Untuk membetulkan keadaan ini, anda mesti membebaskan memori yang diperuntukkan secara manual dengan membuat panggilan eksplisit ke C.free:

C.free(unsafe.Pointer(cstr))

Dengan menerima pendekatan ini, anda memastikan pelupusan memori yang diperuntukkan dengan betul dan mengelakkan kebocoran memori yang akan jika tidak menghantui kod anda.

Atas ialah kandungan terperinci Bagaimana untuk Menyalin Rentetan Go dengan Selamat ke C char* Penunjuk menggunakan CGO?. 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