当前位置: 首页 > 面试题库 >

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

岳正阳
2023-03-14
问题内容

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

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

谁能确切解释什么(*[1 << 30]C.YourType)?它如何unsafe.Pointer变成Go切片?


问题答案:

*[1 << 30]C.YourType本身不做任何事情,这是一种类型。具体来说,它是指向size 1 << 30C.YourType值数组的指针。

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

然后,您将获取转换后的数组值,并将其转换为带有完整切片表达式的切片(切片表达式无需解引用数组值,因此无需在值前加上*,尽管它是一个指针)。

您可以像这样扩展它:

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

// convert unsafePtr to a pointer of the type *[1 << 30]C.YourType
arrayPtr := (*[1 << 30]C.YourType)(unsafePtr)

// slice the array into a Go slice, with the same backing array
// as theCArray, making sure to specify the capacity as well as
// the length.
slice := arrayPtr[0:length:length]


 类似资料:
  • 问题内容: 当我使用Express二进制文件创建示例Express应用程序时,引导代码包含以下几行: 我对app.router的了解不多。我以为这是处理路由(app.get(),app.post()等)规则的中间件,但是当我删除app.use(app.router)时,这些规则也会执行。线。 那么,该中间件的确切用途是什么? 问题答案: 这来自Express 2.x指南http://express

  • 问题内容: 在Tour of Go网站的go 1.5发行之前的版本中,有一段代码看起来像这样。 输出看起来像这样: 令我困扰的是,将其删除后,该程序不再显示“世界”。 为什么呢?如何影响执行力? 问题答案: 注意: 从Go 1.5开始,将GOMAXPROCS设置为硬件内核数:golang.org/doc/go1.5#runtime,低于1.5之前的原始答案。 当您在未指定GOMAXPROCS环境变

  • 根据几个因素(包括OS/浏览器组合),WebDriver可能等待或不等待页面加载。在某些情况下,WebDriver可能会在页面完成加载或甚至开始加载之前返回控制 有人能解释一下在什么情况下WebDriver会在页面完成甚至开始加载之前返回控制吗?

  • 我有一个Spring Boot后端,我刚刚解决了从Angular frontend上传文件时的“ERR_CONNECTION_RESET”问题,方法是配置Tomcat属性。我想弄清楚它到底是做什么的。Tomcat文档对我来说并不明显: 对于中止的上载,Tomcat将吞下的最大请求主体字节数(不包括传输编码开销)。中止上载是指Tomcat知道请求正文将被忽略,但客户端仍然发送它。如果Tomcat没有

  • 问题内容: 我在Python文档的FileObjects中找到了这个: flush()不一定会将文件的数据写入磁盘。使用flush()和os.fsync()来确保此行为。 所以我的问题是:Python到底在做什么?我以为这会强制将数据写入磁盘,但现在我知道并没有。为什么? 问题答案: 通常涉及两个级别的缓冲: 内部缓冲器 操作系统缓冲区 内部缓冲区是由您要针对其进行编程的运行时/库/语言创建的缓冲

  • 问题内容: 我致力于将Google Analytics(分析)和GCM服务添加到当前应用中。在两种服务实施指南中,Google要求开发人员生成一个json文件:google- services.json并将其放在应用程序的根目录下。 我发现,即使我从应用程序中删除了该json文件,该服务仍然有效。 只想确定一下,该文件的真正用途是什么?它的用法是什么以及如何工作? 问题答案: 我对google-s