go - 在Go中将* _Ctype_float转换为float32

标签 go cgo

我是Go语言的新手,很难将* _Ctype_float数据类型转换为[] float32。有什么我想念的吗?我什至想到了将* _Ctype_float转换为字符串,但是那还是不成功。

我有一个名为predictInstance的C函数,该函数返回float*。我从Go by调用此函数

predictionValues := C.predictInstance(
    handle,
    (*C.float)(unsafe.Pointer(&req.FlatInput[0])),
)

现在,当我查看预测值的类型时,它说它是*Ctype_float。现在我想将其转换为[]float32

最佳答案

I have a C function which returns a float* array which I wish to convert to []float32. I am calling this function from Go with a float* array argument.



一个有效的例子
package main

/*
#include <stdlib.h>
#include <float.h>

float *reverse(float *f, int len) {
    float *g = calloc(len, sizeof(float));
    for (int i = 0; i < len; i++) {
        g[i] = f[len-1-i];
    }
    return g;
}
*/
import "C"

import (
    "fmt"
    "math"
    "unsafe"
)

func main() {
    a := []float32{3.14159, 2.718, 1}
    r := make([]float32, len(a))
    fmt.Println("a:", a, "r:", r)
    c := C.reverse((*C.float)(&a[0]), C.int(len(a)))
    copy(r, (*[1 << 20]float32)(unsafe.Pointer(c))[:])
    C.free(unsafe.Pointer(c))
    fmt.Println("a:", a, "r:", r)
}

var okCFloat = func() bool {
    if C.sizeof_float != unsafe.Sizeof(float32(0)) {
        panic("C float != Go float32")
    }
    if C.FLT_MAX != math.MaxFloat32 {
        panic("C float != Go float32")
    }
    return true
}()

输出:
a: [3.14159 2.718 1] r: [0 0 0]
a: [3.14159 2.718 1] r: [1 2.718 3.14159]

关于go - 在Go中将* _Ctype_float转换为float32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59222892/

相关文章:

go - GO中字符串的ASCII编码

go - 无法评估字符串类型的字段 <field>

windows - Windows 上的 golang cgo 退出状态 2

pointers - cgo指针值改变

linux - 有没有办法在一个二进制文件中包含多个 c-archive 包

go - 给接口(interface)赋值会复制什么吗?

pointers - 获取指针地址并在上下文中用作唯一标识符是否安全?

postgresql - 如何将一行的 AVG 放入新列中?

go - 在 go 项目中使用 cgo 包含 libsodium 失败

pointers - 将 Go 指针传递给 Cgo