C++中怎么调用Golang方法(C++,golang,编程语言)

时间:2024-05-04 07:42:14 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

    C%2B%2B%E4%B8%AD%E6%80%8E%E4%B9%88%E8%B0%83%E7%94%A8Golang%E6%96%B9%E6%B3%95

在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息传递给Go的Loader,存在C++调用Go方法,传递字符串的场景。

方案验证时,发现有奇怪的将std::string对象的内容传递给Go方法后,在Go方法协程中取到的值与预期不一致。

经过一段时间的分析和验证,终于理解问题产生的原因并给出解决方案,现分享如下。

Go有自己的内存回收GC机制,通过make等申请的内存不需要手动释放。

C++中为std::string变量赋值新字符串后,.c_str()和.size()的结果会联动变化,尤其是.c_str()指向的地址也有可能变化。

go build -buildmode=c-shared .生成的.h头文件中定义了C++中Go的变量类型的定义映射关系,比如GoString、GoInt等。其中GoString实际是一个结构体,包含一个字符指针和一个字符长度。

通过代码示例方式解释具体现象及原因,详见注释

C++侧代码:

Go侧代码:

Go侧代码通过-buildmode=c-shared的方式生成libgoloader.so及libgoloader.h供C++编译运行使用

程序执行结果:

本文:C++中怎么调用Golang方法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:如何理解分布式结构下,服务部署发布下一篇:

20 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18