Maison >développement back-end >Golang >Comment puis-je diffuser en toute sécurité et efficacement un tableau CGO sur une tranche Go ?
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!