C语言调用GO

silence · · 1313 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

C语言调用GO

最近工作中遇到需要在c语言里面调用go语言的需求,总结了一下,下面代码里面的每一个注释都很有用,闲话不多说,直接上代码~

示例

GO代码:

package main // 这个文件一定要在main包下面

import "C" // 这个 import 也是必须的,有了这个才能生成 .h 文件
// 下面这一行不是注释,是导出为SO库的标准写法,注意 export前面不能有空格!!!
//export hello
func hello(value string)*C.char { // 如果函数有返回值,则要将返回值转换为C语言对应的类型
    return C.CString("hello" + value)
}
func main(){
    // 此处一定要有main函数,有main函数才能让cgo编译器去把包编译成C的库
}

注:如果go函数有多个返回值,会生成一个struct,在写c代码时要用相应的struct接收,参照生成的.h文件

生成so库
go build -buildmode=c-shared -o hello.so hello.go

C代码:

#include <stdio.h>
#include <string.h>
#include "hello.h" // 此处为上一步生成的.h文件

int main(){
    char c1[] = "did";
    GoString s1 = {c1,strlen(c1)};// 构建go类型
    char *c = hello(s1);
    printf("r:%s",c);
    return 0;
}

编译C代码
gcc -o c_go test.c hello.so
注:这里要把之前生成的so文件已写在后面

最后执行:
./c_go


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:silence

查看原文:C语言调用GO

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1313 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传