Maison > développement back-end > Golang > Comment lancer efficacement un tableau de doubles CGO sur une tranche Go de float64 ?

Comment lancer efficacement un tableau de doubles CGO sur une tranche Go de float64 ?

Linda Hamilton
Libérer: 2024-12-13 11:13:22
original
524 Les gens l'ont consulté

How to Efficiently Cast a CGO Array of Doubles to a Go Slice of float64?

Casting d'un tableau CGO en une tranche dans Go

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])}
Copier après la connexion

La réponse réside dans l'exploration de casting alternatif techniques :

La méthode sûre et portable

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])
}
Copier après la connexion

Cette technique parcourt le tableau CGO et attribue manuellement chaque élément à la tranche, garantissant ainsi la sécurité du type.

Le raccourci non portable

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[:]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal