Maison >développement back-end >Golang >Comment copier en toute sécurité des chaînes Go vers des pointeurs C char* à l'aide de CGO ?

Comment copier en toute sécurité des chaînes Go vers des pointeurs C char* à l'aide de CGO ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 12:17:15510parcourir

How to Safely Copy Go Strings to C char* Pointers using CGO?

Copier des chaînes Go vers des pointeurs C char* à l'aide de CGO

Dans le domaine de Go, vous pouvez rencontrer des situations où vous devez échanger de manière transparente données entre votre code Go et les bibliothèques ou applications C. Un de ces scénarios est le transfert de chaînes Go en pointeurs de caractères C (char *) en utilisant la puissance de CGO.

Défi :

Le désir surgit de copier un Go chaîne en un caractère * via les capacités magiques de CGO. La question persiste : cela peut-il être réalisé en utilisant l'approche suivante ?

func copy_string(cstr *C.char) {
    str := "foo"
    C.GoString(cstr) = str
}

Solution :

Bien que l'intention soit noble, l'approche présentée dans l'extrait de code tombe court. Selon la documentation officielle de CGO, la méthode correcte pour convertir une chaîne Go en chaîne C implique d'utiliser la fonction C.CString :

cstr = C.CString(str)

Il est important de garder à l'esprit que C.CString alloue obligatoirement de la mémoire pour toi. Cependant, il ne libère pas automatiquement cette mémoire, la laissant à vos efforts diligents. Pour remédier à cette situation, vous devez libérer manuellement la mémoire allouée en effectuant un appel explicite à C.free :

C.free(unsafe.Pointer(cstr))

En adoptant cette approche, vous garantissez la bonne élimination de la mémoire allouée et évitez les fuites de mémoire qui sinon hantez votre code.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn