Ein CGO-Array in ein Go-Slice umwandeln: Sicherere und raffiniertere Ansätze erkunden
In Go wird die Lücke zwischen CGO-Arrays und Go-Slices geschlossen kann eine wiederkehrende Herausforderung sein. Ein typischer Ansatz besteht darin, jedes CGO-Array-Element manuell in den gewünschten Go-Typ umzuwandeln, wie im folgenden Beispiel zu sehen ist:
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])}
Diese Methode ist zwar funktionsfähig, kann aber mühsam und fehleranfällig sein. Gibt es effizientere und zuverlässigere Möglichkeiten, das gleiche Ergebnis zu erzielen?
Sicheres und tragbares Casting
Ein einfacher Ansatz besteht darin, eine for-Schleife zu verwenden, um jedes CGO-Array explizit zu konvertieren 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]) }
Diese Methode gewährleistet Typsicherheit und Portabilität über verschiedene Plattformen hinweg.
Unsicher und gerissen Trickserei
Alternativ nutzt eine unorthodoxere Lösung die unsichere Paket- und Zeigermanipulation von Go:
c := [6]C.double{1, 2, 3, 4, 5, 6} cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Indem das CGO-Array als Zeiger auf ein float64-Array behandelt wird (unter der Annahme der zugrunde liegenden Typkompatibilität). ), können wir einen Slice ohne explizites Casting erhalten. Diese Methode beruht jedoch auf unsicheren Vorgängen und sollte mit Vorsicht gehandhabt werden.
Das obige ist der detaillierte Inhalt vonWie kann ich ein CGO-Array sicher und effizient in ein Go-Slice umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!