作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试使用 cgo
在 C 代码中使用 Go 包。以下是我的一段代码:
func LinearTransformToUInt8(frame []int64, winWidth int, winCenter int) []uint8 {
var transformed []uint8
// my cool code
return transformed
}
但是,当从 C 调用时,它说
panic: runtime error: cgo result has Go pointer
我认为问题是返回的 []uint8
是 Go 类型,应该用 C 类型替换。但是,我不知道如何实现它。请帮忙!
最佳答案
main.go
package main
import (
"C"
"unsafe"
)
import (
"reflect"
)
func main() {
}
//export phew
func phew() uintptr {
res := make([]uint8, 2)
for i := 0; i < 2; i++ {
res[i] = uint8(i + 1)
}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&res))
return hdr.Data
}
main.c
#include <stdio.h>
#include <inttypes.h>
#include "libtemp.h"
int main(){
uintptr_t resPtr = phew();
uint8_t *res = (uint8_t*)resPtr;
for (int i = 0; i < 2; i++){
printf("%d\n", res[i]);
}
printf("Exiting gracefully\n");
}
您不能传递包含其他 Go 指针、 slice 、字符串、 channel 、函数、接口(interface)、映射包含指针的 Go 指针。
所以不能传递它们,传递指针的规则已记录在案 here Go 的基本类型表示已记录在案 here .
但是一些 Go 贡献者是 saying ,一开始就不应该返回指向 C 代码的 Go 指针。
关于go - 如何在 Go 中返回一个 slice 并从 C 中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52309383/
我是一名优秀的程序员,十分优秀!