Go语言中CGO怎么用
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了Go语言中CGO怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. Go语言调用C函数例子:package m
千家信息网最后更新 2026年11月01日Go语言中CGO怎么用
这篇文章主要介绍了Go语言中CGO怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
1. Go语言调用C函数例子:
package main //// 引用的C头文件需要在注释中声明,紧接着注释需要有import "C",且这一行和注释之间不能有空格// /*#include#include #include void myprint(char* s) { printf("%s\n", s);}*/import "C" import ( "fmt" "unsafe") func main() { //使用C.CString创建的字符串需要手动释放。 cs := C.CString("Hello World\n") C.myprint(cs) C.free(unsafe.Pointer(cs)) fmt.Println("call C.sleep for 3s") C.sleep(3) return}
运行:
2. Go语言调用C库函数:
hello.c
#includevoid hello(){ printf("hello world\n"); }
hello.h
#ifndef HELLO_H#define HELLO_H void hello(void);#endif
编译:
gcc -c hello.car -cru libhello.a hello.o
package main //使用#cgo定义库路径 /*#cgo CFLAGS: -I .#cgo LDFLAGS: -L . -lhello#include "hello.h"*/import "C" func main() { C.hello()}运行:
3. Go语言导出函数给C语言使用:
main.go
package main ////#include//int add(int a, int b);//import "C" import ( "fmt") //当使用export的时候,在同一个文件中就不能再定义其它的c函数了,不然会报错。//使用export导出函数给c语言调用。 //export GoAddfunc GoAdd(a, b int) int { return a + b} func main() { a := C.add(1, 2) fmt.Printf("C.add(1,2) return %d\n", a)}
cfunc.go
package main ////int GoAdd(int a, int b); ////int add(int a, int b)//{// return GoAdd(a,b);//}//import "C"运行:
4. Go语言导出函数指针给c语言使用:
还有一种使用方式,这种是我使用比较多的。就是传递函数指针,因为GO函数无法取址,因此需要写个中间函数做个转换操作,例子如下:
clibrary.c
#include#include "clibrary.h" //参数是函数指针void some_c_func(callback_fcn callback){ int arg = 2; printf("C.some_c_func(): calling callback with arg = %d\n", arg); int response = callback(2); printf("C.some_c_func(): callback responded with %d\n", response);}
clibrary.h
#ifndef CLIBRARY_H#define CLIBRARY_H//定义函数指针typedef int (*callback_fcn)(int);void some_c_func(callback_fcn);#endif
Go code:
package main /*#cgo CFLAGS: -I .#cgo LDFLAGS: -L . -lclibrary#include "clibrary.h"int callOnMeGo_cgo(int in); // 声明*/import "C" import ( "fmt" "unsafe") //export callOnMeGofunc callOnMeGo(in int) int { return in + 1} func main() { fmt.Printf("Go.main(): calling C function with callback to us\n") //使用unsafe.Pointer转换 C.some_c_func((C.callback_fcn)(unsafe.Pointer(C.callOnMeGo_cgo)))}中间函数:
package main /* #includeint callOnMeGo(int); // The gateway functionint callOnMeGo_cgo(int in){ printf("C.callOnMeGo_cgo(): called with arg = %d\n", in); //调用GO函数 return callOnMeGo(in);}*/import "C"
运行:
开发注意事项:
1. 在注释和import"C"之间不能有空行
2. 使用C.CString函数转换GoString为CString时要手动释放该字符串。
3. CGO不支持使用变参的函数,例如printf,如果要使用的话,可以写个包裹函数m'yprintf,使用传参的方式调用。
4. Go支持使用//export导出函数给C使用,但是有一点需要注意就是不能在export导出的同一个文件里定义c函数,不然会出现
multiple definition of "xxx"编译错误,如果函数非常tiny的话,还有一个方法是使用static inline 来声明该函数,如下:
package gocallback import ( "fmt" "sync") /*extern void go_callback_int(int foo, int p1);// normally you will have to define function or variables// in another separate C file to avoid the multiple definition// errors, however, using "static inline" is a nice workaround// for simple functions like this one.static inline void CallMyFunction(int foo) { go_callback_int(foo, 5);}*/import "C"感谢你能够认真阅读完这篇文章,希望小编分享的"Go语言中CGO怎么用"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
函数
语言
指针
注释
篇文章
运行
文件
支持
之间
例子
字符
字符串
就是
手动
方式
编译
一行
事项
价值
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手磨咖啡
云南咖啡
互联网科技园
广东猪兼强互联网科技有限公司
互联网核心科技是什么
互联网科技与金融科技
南京欣网互联网科技
百单互联网科技有限公司
天津摩尔互联网科技
火传媒上海互联网科技
北京华百购互联网科技有限公司
互联网为啥属于高科技
互联网科技商业
哈尔滨屹滨互联网科技有限公司
科技类公司包括互联网吗
工业互联网展湾科技股份有限公司
南通创西澳互联网科技有限公司
小米互联网科技园入驻
中天科技中国工业互联网
互联网科技企业商标注意事项
国智互联网科技
易互联网科技有限公司
互联网前沿科技
成都狮子座互联网科技
互联网科技公司需要的职位
承德科技产业互联网发展
烟台灵鸽互联网科技有限公司
数字科技和互联网金融哪个好
银川新华互联网科技学校招聘
伍佰万互联网科技是干嘛的