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!