如何在Go中返回切片并从C调用?

时间:2018-09-13 08:15:02

标签: go cgo

我正在尝试使用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类型。但是,我不知道如何实现它。请帮忙!

1 个答案:

答案 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代码的指针。