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++

未完待续...

posted @   江南烟雨梦  阅读(4176)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示