Lors de l'appel de fonctions C depuis Go à l'aide de cgo, il est souvent nécessaire de passer des pointeurs vers des tranches Go comme arguments. Cependant, cela peut être difficile car les tranches Go ne sont pas directement compatibles avec les tableaux C.
Pour résoudre ce problème, il est nécessaire d'allouer le tableau en mémoire C et de transmettre un pointeur vers ce tableau à la fonction C. Cela garantit que la fonction C peut modifier le tableau et le renvoyer à Go.
Voici un exemple qui montre comment allouer un tableau en C et lui passer un pointeur à partir d'une tranche 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) }
En allouant le tableau en mémoire C, la fonction C peut modifier son contenu et les modifications seront propagées à la tranche Go lorsque la fonction C revient.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!