Apabila memanggil fungsi C daripada Go menggunakan cgo, selalunya perlu menghantar penunjuk kepada kepingan Go sebagai argumen. Walau bagaimanapun, ini boleh mencabar kerana kepingan Go tidak serasi secara langsung dengan tatasusunan C.
Untuk menangani isu ini, adalah perlu untuk memperuntukkan tatasusunan dalam memori C dan menghantar penuding kepada tatasusunan itu kepada fungsi C. Ini memastikan bahawa fungsi C boleh mengubah suai tatasusunan dan mengembalikannya kembali kepada Go.
Berikut ialah contoh yang menunjukkan cara memperuntukkan tatasusunan dalam C dan menghantar penuding kepadanya daripada kepingan Go:
// C function signature: int f(int *count, char ***strs) import "C" func go_f(strs []string) int { count := len(strs) c_count := C.int(count) // Allocate an array in C memory to store the strings cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go array so we can access its elements a := (*[1<<30 - 1]*C.char)(cArray) // Copy the Go strings into the C array for index, value := range strs { a[index] = C.CString(value) } // Call the C function with a pointer to the C array err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray))) // Free the C array C.free(cArray) return int(err) }
Dengan memperuntukkan tatasusunan dalam memori C, fungsi C boleh mengubah suai kandungannya dan perubahan akan disebarkan kembali ke kepingan Go apabila fungsi C kembali.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar Penunjuk Go Slice ke Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!