我正在尝试使用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类型。但是,我不知道如何实现它。请帮忙!
答案 0 :(得分:0)
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指针,切片,字符串,通道,函数,接口,映射包含指针的Go指针。
因此,不能传递它们,指针{@ 3}记录了传递指针的规则,here记录了go的基本类型表示。
但是,一些Go贡献者是here,因此一开始就不应返回Go指向C代码的指针。