登录
首页 >  Golang >  Go问答

将 cgo 数组转换为切片

来源:Golang技术栈

时间:2023-04-24 11:55:26 385浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《将 cgo 数组转换为切片》,就很适合你,本篇文章讲解的知识点主要包括golang。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

目前我这样做是为了将一个 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 中不同类型的切片/数组之间进行转换的一般方式。

正确答案

你有这样做的正常和安全的方式:

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 数组转换为切片》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>