Golang Go语言“非主流”技巧 分享(1) --生成 c 可调用代码

Golang Go语言“非主流”技巧 分享(1) --生成 c 可调用代码

golang 得益与强大的生态,开发起来顺风顺水。c 语言作为老牌高性能语言,还是很多童鞋的最爱,但是开发效率是硬伤。假如要在 c 庞大的协议框架代码上改来该去,又或者要写个 c 网络通信的 sdk(提供 http 或者 websocket 协议)。有没有快速的方法搞定这些事情,这两个语言能不能摩擦出火花。还真的可以。。。请看下面的例子

导出字符串函数给 c 用

下面把 go 里面的 ReplaceAll 函数导出给 c 用。
函数上面的 export ReplaceStrAll 是必须的,告诉编译器,你要什么名字的 c 函数

  • 包装 go 函数到 c 里面
package main

import ( “strings” )

import “C”

//export ReplaceStrAll func ReplaceStrAll(str *C.char, old *C.char, new *C.char) (rv *C.char) {

s := C.GoString(str)
oldStr := C.GoString(old)
newStr := C.GoString(new)

repRv := strings.Replace(s, oldStr, newStr, -1) 
rv = C.CString(repRv)
return

}

func main() { }

  • 编译命令(生成 c 静态库)
env GOPATH=`pwd` go build -buildmode=c-archive -o replace.a replace.go
  • 使用
#include <stdio.h>
#include <stdlib.h>
#include "replace.h"

int main() { char * p = ReplaceStrAll(“aaa hello world bbb hello world ccc hello world ddd”, “hello world”, “”); printf("%s\n", p); free§; return 0; }

  • 编译命令
gcc -I .  use.c replace.a -Wall -lpthread

未完待续

由于要做饭,后面还有几个例子等有时间完善。

github

https://github.com/guonaihong/gout


更多关于Golang Go语言“非主流”技巧 分享(1) --生成 c 可调用代码的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

好奇下,C 调用 Go 代码,那 Go 运行时咋办

更多关于Golang Go语言“非主流”技巧 分享(1) --生成 c 可调用代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个编译出来的库体积大吗?

go 运行时会初始化。而且只能有一个初始化,所以你想链接两个 .a,是不行的,因为两套运行时会导致符号冲突。所以使用场景限制是比较大的。

大,golang 语言特色。刚刚的代码编译的库大约 3.4MB

在Golang(Go语言)社区中,虽然有一些被广泛使用的标准库和惯用法,但探索一些“非主流”技巧也能带来意想不到的收获。你提到的生成C可调用代码的技巧,确实是一个非常有价值的领域,尤其在跨语言项目或性能优化场景中。

Go语言通过cgo工具链支持调用C代码,同时也允许从C代码中调用Go函数。生成C可调用的Go代码,关键在于使用//export注释来标记Go函数,使其暴露给C代码。此外,还需确保Go运行时正确初始化,以支持这些导出函数的执行环境。

以下是一个简单示例:

package main

/*
#include <stdint.h>
*/
import "C"
import "fmt"

//export Hello
func Hello(name *C.char) {
    goName := C.GoString(name)
    fmt.Printf("Hello, %s!\n", goName)
}

func main() {}

在这个例子中,Hello函数被导出为C可调用的函数。需要注意的是,由于Go的并发模型和垃圾回收机制,直接从C调用Go函数时需要特别小心内存管理和并发控制,以避免崩溃或未定义行为。

这种技巧虽然“非主流”,但在需要Go与C/C++代码深度集成的场景下非常有用。通过合理设计,可以在享受Go语言开发效率的同时,利用C/C++在性能或特定库支持上的优势。

回到顶部