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

问题描述 投票:0回答:1

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

go cgo
1个回答
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指针,切片,字符串,通道,函数,接口,地图包含指针。

所以一个人无法传递它们,传递指针的规则记录了here和go的基本类型的表示形式记录here

但是一些Go贡献者是saying,首先不应该返回一个指向C代码的Go指针。

© www.soinside.com 2019 - 2024. All rights reserved.