C++中怎么调用Golang方法
导读:本文共2812.5字符,通常情况下阅读需要9分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 现象在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息传递给Go的Loader,存在C++调用Go方法,传递字符串的场景。方案验证时,发现有奇怪的将std::string对象的内容传递给Go方法后,在Go方法协程中取到的值与预期不一致。经过一段时间的分析和验证,终于理解问题产生的原因并给出解决方案... ...
目录
(为您整理了一些要点),点击可以直达。在一个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方法的详细内容,希望对您有所帮助,信息来源于网络。