Maison >développement back-end >Golang >Comment transmettre des tranches Go aux fonctions C et gérer les modifications du pointeur ?
Passer des pointeurs vers des tranches vers des fonctions C dans Go
Lors de l'appel de fonctions C depuis Go à l'aide de cgo, il peut être difficile de transmettre des pointeurs vers tranches. Considérons une fonction C comme :
int f(int *count, char ***strs);
où count est la longueur du tableau strs, strs est un tableau de chaînes et la valeur de retour indique un statut d'erreur.
Dans Go, on pourrait initialement tenter de transmettre count et strs comme suit :
C.f((*C.int)(&count), (**C.char)(&strs[0]))
Cependant, cela ne permettra pas de modifier les strs en C. Pour activer cela, il est nécessaire pour allouer le tableau en C. Semblable à C.CString, il est essentiel de savoir où libérer le tableau externe, en particulier lorsque la fonction C alloue potentiellement un nouveau tableau.
Le code ci-dessous montre comment allouer le tableau C :
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go array for indexing a := (*[1<<30 - 1]*C.char)(cArray) for index, value := range strs { a[index] = C.CString(value) } err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
Dans ce code, cArray est alloué en C, a est un wrapper de tranche autour de ce tableau pour permettre l'indexation, et chaque chaîne est copié dans la mémoire C. La fonction f peut désormais modifier les chaînes en C et renvoyer la valeur modifiée à Go.
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!