Wenn Sie mit Datenstrukturen arbeiten, die aus C-Code in Go stammen, müssen Sie möglicherweise ein C-Array konvertieren. style-Array in ein Go-Slice. In diesem Zusammenhang lautet die zugrunde liegende Frage: Können wir einen effizienteren Weg finden, ein CGO-Array von Doubles in ein Float64-Slice umzuwandeln, als die umständliche Methode unten:
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])}
Die Antwort liegt in der Erforschung alternativer Castings Techniken:
Für eine sichere und tragbare Lösung kann man sich für Folgendes entscheiden Ansatz:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } fs := make([]float64, len(c)) for i := range c { fs[i] = float64(c[i]) }
Diese Technik iteriert über das CGO-Array und weist jedes Element manuell dem Slice zu, um Typsicherheit zu gewährleisten.
Alternativ für a Eine weniger konventionelle und potenziell riskante Lösung gibt es:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Hier nutzen wir die Tatsache aus, dass sowohl C.double als auch float64 belegt das gleiche zugrunde liegende Speicherlayout (falls dies in Ihrem spezifischen Szenario tatsächlich der Fall ist). Mithilfe unsicherer Zeiger wandeln wir das CGO-Array in das entsprechende float64-Array um und teilen es auf.
Achtung: Dieser unsichere Ansatz sollte mit Vorsicht verwendet werden, da er bei Nichtbeachtung der Annahmen zu undefiniertem Verhalten führen kann Informationen zum Speicherlayout sind falsch.
Das obige ist der detaillierte Inhalt vonWie kann man ein CGO-Array von Doubles effizient in ein Go-Slice von float64 umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!