【问题标题】:passing a byte array from go to cgo将字节数组从 go 传递到 cgo
【发布时间】:2015-07-23 12:00:14
【问题描述】:

我有以下 C 代码

uint32_t cHash32(const char *s, size_t len) { return util::Hash32(s, len); }

我从一个 go 项目中调用它,如下所示

func Hash32(s []byte) uint32 {
    return uint32(C.cHash32((*C.char)(unsafe.Pointer(&s)),   C.size_t(len(s))))
}

不知何故,结果被破坏了。

当传递“hi”时,根据 python 绑定到同一库(谷歌的farmhash),预期结果应该是 4063302914。

我想假设 s 可以翻译成 *C.char 有点幼稚,不是吗!

如何将 s 的内容作为 *C.char 传递?

【问题讨论】:

  • “结果不知何故坏了”...
  • 改进的描述
  • 尝试将unsafe.Pointer(&s) 替换为unsafe.Pointer(&s[0])。 FWIW,Go binding for farmhash 已经存在。
  • RTM,还有this
  • :: 用于命名空间限定的代码看起来不太像 C。

标签: c go cgo


【解决方案1】:

是的,您可以通过C.CString 在 Go 中创建 *C.char。谷歌游乐场不允许使用cgo,因此您需要下载此链接并在本地运行才能使用它。

http://play.golang.org/p/inthA1i0C2

将字节切片转换为字符串,然后转换为 *char C.CString(string([]byte("bytes")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 2021-09-28
    • 2017-07-04
    • 1970-01-01
    • 2023-02-24
    • 2021-09-13
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多