我正在尝试使用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指针,其中包含其他Go指针,切片,字符串,通道,函数,接口,地图包含指针。
所以一个人无法传递它们,传递指针的规则记录了here和go的基本类型的表示形式记录here。
但是一些Go贡献者是saying,首先不应该返回一个指向C代码的Go指针。