Lorsque vous travaillez avec des structures de données provenant du code C dans Go, vous pouvez rencontrer le besoin de convertir un C- tableau de style dans une tranche Go. Dans ce contexte, la question sous-jacente est : pouvons-nous trouver un moyen plus efficace de convertir un tableau CGO de doubles en une tranche de float64 que la méthode maladroite ci-dessous :
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])}
La réponse réside dans l'exploration de casting alternatif techniques :
Pour une solution sûre et portable, on peut opter pour ce qui suit approche :
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 technique parcourt le tableau CGO et attribue manuellement chaque élément à la tranche, garantissant ainsi la sécurité du type.
Alternativement, pour un solution moins conventionnelle et potentiellement risquée, il existe :
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Ici, nous exploitons le fait que C.double et float64 occupe la même disposition de mémoire sous-jacente (si c'est effectivement le cas dans votre scénario spécifique). À l'aide de pointeurs non sécurisés, nous convertissons le tableau CGO en tableau float64 correspondant et le découpons.
Attention : Cette approche non sécurisée doit être utilisée avec précaution car elle peut conduire à un comportement indéfini si les hypothèses sur la disposition de la mémoire sont incorrects.
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!