文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-05 00:05

关注

本篇文章给大家分享《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的相关知识,也可关注编程网公众号。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯