登录
首页 >  Golang >  Go问答

(*[1 << 30]C.YourType) 在 CGo 中到底做了什么?

来源:Golang技术栈

时间:2023-03-06 20:41:48 143浏览 收藏

大家好,今天本人给大家带来文章《(*[1 ,文中内容主要涉及到golang,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

在Golang wiki中的“将 C 数组转换为 Go 切片”下,有一段代码演示了如何创建由 C 数组支持的 Go 切片。

import "C"
import "unsafe"
...
        var theCArray *C.YourType = C.getTheArray()
        length := C.getTheArrayLength()
        slice := (*[1 

谁能准确解释一下是什么(*[1 ?它是如何将 anunsafe.Pointer变成 Go 切片的?

正确答案

*[1 它本身不做任何事情,它是一种类型。具体来说,它是一个指向大小数组的1 指针C.YourType。大小是任意的,仅表示需要在主机系统上有效的上限。

您在第三个表达式中所做的是类型转换。这会将 转换unsafe.Pointer*[1 .

然后,您获取转换后的数组值,并将其转换为具有完整切片表达式的切片(不需要为切片表达式取消引用数组值,因此无需在值前面加上 a *,甚至虽然它是一个指针)。

你可以像这样扩展它:

// unsafe.Pointer to the C array
unsafePtr := unsafe.Pointer(theCArray)

// convert unsafePtr to a pointer of the type *[1 

此构造已被unsafe.Slicego1.17 中的通用函数替换:

slice := unsafe.Slice(theCArray, length)

本篇关于《(*[1

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