登录
首页 >  Golang >  Go问答

CGO C# 字符串数组到 GO 切片

来源:stackoverflow

时间:2024-03-31 17:00:36 487浏览 收藏

本篇文章给大家分享《CGO C# 字符串数组到 GO 切片》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我正在使用 cgo 从 go 代码编译 c 库。然后从 c# 调用库函数。

在此 go 代码中,我有一个需要 []string 输入的函数,例如: func stringarray(strings []string)

我还有另一个需要 []int 输入的函数,例如: func intarray(vals []int)

如果我查看生成的头文件,我可以看到上述函数的以下内容:

extern __declspec(dllexport) void intarray(goslice vals);
extern __declspec(dllexport) void stringarray(goslice strings);

通过创建以下结构,我可以从 c# 成功调用 intarray 函数:

internal struct goslice
{
    public intptr data;
    public long len, cap;
    public goslice(intptr data, long len, long cap)
    {
        this.data = data;
        this.len = len;
        this.cap = cap;
    }
}

然后像这样调用函数:

long[] data = { 1, 2, 3, 4, 5, 6 };
intptr data_ptr = marshal.allochglobal(buffer.bytelength(data));
marshal.copy(data, 0, data_ptr, data.length);
var nums = new goslice(data_ptr, data.length, data.length);
intarray(nums);
marshal.copy(nums.data, data, 0, data.length);

我还可以通过创建以下结构成功调用需要字符串输入的函数:

internal struct gostring
{
    public string msg;
    public long len;
    public gostring(string msg, long len)
    {
        this.msg = msg;
        this.len = len;
    }
}

然后像这样调用函数:

string inputString = "Test";
GoString goString = new GoString(inputString, inputString.Length);

StringInput(goString);

我努力实现的目标是将预期的 []string goslice 传递给 stringarray 函数。有什么建议么?我需要 goslice 包含字符串而不是整数。

我尝试过以各种方式将字符串传递到 goslice,而不是整数,这不适用于混合结果。我期望最终得到一个 []string goslice,它可以在从 c# 调用“cgo 编译”go 函数时使用。


正确答案


感谢 liams 的意见,我设法想出了以下解决方案。

导出的go函数:

65bdd3795052

自从我使用 go 1.20.1 版本以来,我实际上进行了更改:

tmpslice := (*[1 << 30]*c.char)(unsafe.pointer(argv))[:length:length]

致:

65bdd3795065

根据 cgo wiki 的文档:https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices

c# 平台调用 (p/invoke):

65bdd3795069

c# 库调用:

65bdd379506d

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>