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
Lepaskan: 2024-12-01 12:17:15
asal
583 orang telah melayarinya

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

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

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

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!

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