Maison >développement back-end >Golang >Comment puis-je diffuser en toute sécurité et efficacement un tableau CGO sur une tranche Go ?

Comment puis-je diffuser en toute sécurité et efficacement un tableau CGO sur une tranche Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-06 06:16:23190parcourir

How Can I Safely and Efficiently Cast a CGO Array to a Go Slice?

Couler un tableau CGO sur une tranche Go : explorer des approches plus sûres et plus astucieuses

En Go, combler le fossé entre les tableaux CGO et les tranches Go peut être un défi récurrent. Une approche typique consiste à convertir manuellement chaque élément du tableau CGO en type Go souhaité, comme le montre l'exemple suivant :

doubleSlc := [6]C.double{}

// Fill doubleSlc

floatSlc := []float64{float64(doubleSlc[0]), float64(doubleSlc[1]), float64(doubleSlc[2]),
                      float64(doubleSlc[3]), float64(doubleSlc[4]), float64(doubleSlc[5])}

Bien que fonctionnelle, cette méthode peut être fastidieuse et sujette à des erreurs. Existe-t-il des moyens plus efficaces et plus fiables d'obtenir le même résultat ?

Casting sûr et portable

Une approche simple consiste à utiliser une boucle for pour convertir explicitement chaque tableau CGO. element :

c := [6]C.double{1, 2, 3, 4, 5, 6}
fs := make([]float64, len(c))
for i := range c {
  fs[i] = float64(c[i])
}

Cette méthode garantit la sécurité du type et la portabilité sur différentes plates-formes.

Dangereux et rusé Trickery

Alternativement, une solution plus peu orthodoxe exploite le package non sécurisé de Go et la manipulation du pointeur :

c := [6]C.double{1, 2, 3, 4, 5, 6}
cfa := (*[6]float64)(unsafe.Pointer(&c))
cfs := cfa[:]

En traitant le tableau CGO comme un pointeur vers un tableau float64 (en supposant une compatibilité de type sous-jacente ), on peut obtenir une tranche sans casting explicite. Cependant, cette méthode repose sur des opérations dangereuses et doit être utilisée avec prudence.

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