Go与C/C++ 互相调用
A. Go调用C
1、Go调用C:在go文件里调C(以下代码中除了开头的注释之外,其他注释不可删除)
/* * go 和 C 互调用程序 */ package main /* int Add( int a, int b ) { return a + b; } */ import "C" import ( "fmt" ) func main() { fmt.Println(C.Add(1, 2)) }
上面的C代码虽然被“注释”了,但是Go可以直接调
2、Go调用C:通过.h头文件调(以下代码中除了开头的注释之外,其他注释不可删除)
/* * go 和 C 互调用程序 */ package main /* #include "MyHeadFile.h" */ import "C" import ( "fmt" ) func main() { fmt.Println(C.MyFunc("Hello")) }
上面代码以注释的方式导入MyHeadFile.h头文件,然后可以直接使用其中的函数
3、Go生成动态库dll(以下代码中除了开头的注释之外,其他注释不可删除)
/* * Go生成动态库的命令(Windows平台需安装mingw-w64): * go build -o hello.dll -buildmode=c-shared hello.go * go build -o hello.so -buildmode=c-shared hello.go */ package main import "C" import ( "fmt" ) //export HelloGolang func HelloGolang() { fmt.Println("HelloGolang") } func main() { fmt.Println("main") }
4、示例:Go调C并返回
package main /* #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 1024 char* Foo( char *input ) { char* res = malloc( LEN * sizeof( char ) ); sprintf( res, "%s %s", input, "World!" ); return res; }*/ import "C" import ( "fmt" "unsafe" ) func getID() string { cs := C.CString( "Hello" ) res := C.Foo( cs ) str := C.GoString( res ) C.free( unsafe.Pointer( cs ) ) C.free( unsafe.Pointer( res) ) return str } func main() { fmt.Println( getID() ) }
B. Go调用C++
未完待续...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架