Maison >développement back-end >Golang >Comment puis-je transmettre une tranche Go à une fonction C qui attend un pointeur vers un tableau de chaînes C ?
Passer un pointeur vers une tranche vers une fonction C dans Go
Dans Go, une tâche courante lors de l'interaction avec des fonctions C consiste à passer des tâches complexes des structures de données telles que des tranches. Cependant, les tranches Go et les tableaux C présentent des différences fondamentales qui nécessitent un traitement spécial.
Considérez la fonction C suivante avec la signature int f(int *count, char ***strs). Il faut deux pointeurs : count pointe vers la longueur d'un tableau de chaînes, et strs pointe vers un tableau de pointeurs de chaînes.
Dans Go, nous ne pouvons pas passer directement une tranche à une telle fonction car les tranches sont une structure de données spécifique à Go et diffère des tableaux C. De plus, les tranches Go contiennent un pointeur Go, que cgo interdit de transmettre aux fonctions C.
Pour surmonter cela, nous devons allouer le tableau en C manuellement et suivre où libérer le tableau externe . Pour chaque chaîne de la tranche Go, nous la convertissons en chaîne C à l'aide de C.CString et enregistrons les pointeurs de chaîne C correspondants dans le tableau C alloué.
Voici une version modifiée du code Go :
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go Array for easy 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)))
Cette approche garantit que la fonction C a accès à un tableau C manipulable, tout en nous permettant de reconvertir le tableau manipulé en tranche Go pour une utilisation ultérieure.
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!