2016-04-11 15 views
0

Im Moment habe ich dies tun, um eine CGO Array von Double in eine Scheibe von float64 zum Gießen:Gießen eines CGO-Array in eine Scheibe

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])} 

Gibt es eine weniger umständliche Weg, um die gleiche Sache zu tun? Ich nehme an, dass dies auch als eine generelle Art gesehen werden kann, zwischen Slices/Arrays verschiedener Typen in Go zu werfen.

+0

Das Hauptproblem hier ist das Umwandeln des Arrays in einen neuen Typ, nicht das Array, um die gleiche Art Transformation zu schneiden ... – MonkeyButter

+0

Sorry, verpasste das. Es gibt keinen anderen Weg als eine Schleife, aber natürlich muss man es nicht manuell einzeln machen. –

Antwort

1

Sie haben die normale und sichere Art und Weise, dies zu tun:

c := [6]C.double{ 1, 2, 3, 4, 5, 6 } 
fs := make([]float64, len(c)) 
for i := range c { 
     fs[i] = float64(c[i]) 
} 

Oder Sie könnten betrüge unportably und dies tun:

c := [6]C.double{ 1, 2, 3, 4, 5, 6 } 
cfa := (*[6]float64)(unsafe.Pointer(&c)) 
cfs := cfa[:] 

Wenn C.double und float64 der gleiche zugrunde liegende Typ ist, können wir nehmen ein Zeiger auf das C.double-Array, wirf es unsicher auf einen Zeiger auf ein float64-Array gleicher Größe und nimm dann eine Scheibe dieses Arrays.

Natürlich heißt es aus einem sehr guten Grund unsafe.