首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go语言中的//export:让你的Go函数被C调用!

Go语言中的//export:让你的Go函数被C调用!

作者头像
技术圈
发布2026-01-28 16:17:54
发布2026-01-28 16:17:54
1200
举报

在日常开发中,我们有时会遇到这样的场景:需要用C语言调用Go语言编写的函数。这时,//export 指令就派上了用场。

什么是//export?

//export 是Go语言中的一个特殊注释指令,用于将Go函数导出为C语言函数,使C代码能够直接调用Go函数。

当我们在Go函数前添加 //export 注释时,Go编译器会生成相应的C语言头文件,其中包含该函数的C接口声明。这样,C程序就可以像调用普通C函数一样调用Go函数了。

基本语法规则

使用 //export 有两个基本要求:

  1. 必须在函数声明前添加 //export 函数名 注释
  2. 必须导入C包(import "C"

需要注意的是,//export 和函数名之间不能有空格,且 // 后直接跟 export

简单示例:一个可运行的加法函数

下面是一个完整且可运行的示例,展示了如何将Go函数导出给C调用:

代码语言:javascript
复制
// add.go
package main

import "C"

//export Add
func Add(a, b C.int) C.int {
    return a + b
}

func main() {
    // 此处留空,但必须有main函数
}

将上述代码保存为 add.go,然后使用以下命令编译:

代码语言:javascript
复制
go build -buildmode=c-shared -o add.so add.go

此命令会生成 add.so(动态库)和 add.h(头文件)两个文件。

C代码调用示例

以下是C语言调用上述Go函数的示例代码:

代码语言:javascript
复制
// main.c
#include <stdio.h>
#include "add.h"  // 包含自动生成的头文件

int main() {
    int result = Add(5, 3);
    printf("5 + 3 = %d\n", result);
    return 0;
}

编译并运行C程序:

代码语言:javascript
复制
gcc -o main main.c add.so
./main

运行结果将会显示:5 + 3 = 8

注意事项

  1. 内存管理:Go和C的内存管理方式不同。如果函数涉及字符串等复杂数据类型,需要手动管理内存,防止泄漏。
  2. 类型转换:Go的int类型与C的int类型兼容,但其他类型(如字符串)需要转换。
  3. 平台兼容性:编译生成的动态库是平台相关的,不同操作系统需要重新编译。

实际应用场景

//export 在实际开发中有多种应用:

  • 性能优化:将计算密集型任务用Go实现,供C/C++程序调用
  • 代码复用:利用Go丰富的标准库,避免C重复造轮子
  • 跨语言开发:作为桥梁,连接Go与其他语言

写在最后

//export 指令是Go语言与C交互的重要工具,它简化了跨语言调用的复杂度。通过本文的示例,你可以快速上手这一功能,为项目增加跨语言能力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术圈子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是//export?
  • 基本语法规则
  • 简单示例:一个可运行的加法函数
  • C代码调用示例
  • 注意事项
  • 实际应用场景
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档