将 cgo 数组转换为切片
casting a cgo array into a slice
目前我这样做是为了将 CGO 双精度数组转换为 float64 切片:
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])}
有没有更简单的方法来做同样的事情?我想这也可以看作是在 Go 中 slices/arrays 不同类型之间进行转换的一般方法。
你有这样做的正常和安全的方式:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 }
fs := make([]float64, len(c))
for i := range c {
fs[i] = float64(c[i])
}
或者你可以作弊并这样做:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 }
cfa := (*[6]float64)(unsafe.Pointer(&c))
cfs := cfa[:]
如果 C.double
和 float64
是相同的底层类型,我们可以获取指向 C.double 数组的指针,不安全地将其转换为指向相同大小的 float64 数组的指针,然后取该数组的一部分。
当然,它被称为 unsafe
是有充分理由的。
目前我这样做是为了将 CGO 双精度数组转换为 float64 切片:
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])}
有没有更简单的方法来做同样的事情?我想这也可以看作是在 Go 中 slices/arrays 不同类型之间进行转换的一般方法。
你有这样做的正常和安全的方式:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 }
fs := make([]float64, len(c))
for i := range c {
fs[i] = float64(c[i])
}
或者你可以作弊并这样做:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 }
cfa := (*[6]float64)(unsafe.Pointer(&c))
cfs := cfa[:]
如果 C.double
和 float64
是相同的底层类型,我们可以获取指向 C.double 数组的指针,不安全地将其转换为指向相同大小的 float64 数组的指针,然后取该数组的一部分。
当然,它被称为 unsafe
是有充分理由的。