Go语言中CGO怎么用
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍了Go语言中CGO怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. Go语言调用C函数例子:package m
千家信息网最后更新 2025年01月18日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安全错误
数据库的锁怎样保障安全
网络安全运维需要什么证书
怎么打开云数据库客户端
数据库系统概论考研面试题
网络安全法是哪个部门
教你如何守护孩子的网络安全
网络安全与隐私保护游戏
桓台网络审批oa软件开发
网络安全课程进校园
软件开发和项目实施哪个更好
郎木寺住宿软件开发
mysql服务器软中断
互联网企业是科技吗
复制数据库失败
易语言 数据库 删除
丝路互联网电子科技有限公司
同有飞骥服务器
csgo服务器维护
高级软件开发面试
阿里云服务器 安全吗
吉大数据库实验报告
嵌入式开发和纯软件开发哪个好
株洲it软件开发师培训排名
服务器管理怎么进去
网络安全攻防对抗场景
数据库中的数量和金额
mysql服务器软中断
小赢科技在互联网什么水平
怎么输出数据库jdbc
奥丁神叛手游服务器忙怎么办
征途单机数据库在哪