将cgo数组转换为切片

目前,我这样做是为了将CGO的double数组转换为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中不同类型的切片/数组之间进行转换的一种通用方法。

回答:

您具有执行此操作的正常和安全的方法:

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.doublefloat64是相同的基础类型,我们可以使用指向C.double数组的指针,不安全地将其强制转换为相同大小的float64数组的指针,然后获取该数组的一部分。

当然,调用它unsafe是有充分理由的。

以上是 将cgo数组转换为切片 的全部内容, 来源链接: utcz.com/qa/412220.html

回到顶部