go 框架可通过 c++go 和 swig 与原生代码交互:cgo 允许直接调用 c 函数,生成 go 参数和 c 类型之间的转换包装器。swig 生成包装器代码,将 c/c++ 代码与 go 代码接口化,提供高级抽象和定制。

Go 框架扩展与原生代码互操作
在 Go 应用程序中,我们经常需要与原生代码进行交互,例如调用 C 库或使用系统调用。Go 提供了两种主要机制来实现这一目标:CGO 和 SWIG。
CGO
立即学习“go语言免费学习笔记(深入)”;
CGO 允许直接从 Go 代码中调用 C 函数。它通过使用编译器来生成一个包装器,该包装器将 Go 参数转换为 C 类型并调用 C 代码。
import "C"
func main() {
C.puts(C.CString("Hello from Go!"))
}SWIG
SWIG(Simplified Wrapper and Interface Generator)是一个工具,可以生成自动将 C/C++ 代码与 Go 代码接口的包装器代码。与 CGO 相比,SWIG 提供了更高级别的抽象和定制,但它需要额外的设置。
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
swig -go -c++ mymodule.i go build -ldflags=-extldflags="-static"
实战案例
使用 CGO 调用 C 库以解析 JSON
假设我们有一个名为 libjson 的 C 库,它提供了解析 JSON 字符串的功能。我们可以使用 CGO 调用这个库:
package main /* #cgo LDFLAGS: -ljson #include#include void parse_json(const char* json_string); */ import "C" func main() { input := "{"foo":"bar"}" C.parse_json(C.CString(input)) }
使用 SWIG 调用 C++ 类
假设我们有一个名为 MyClass 的 C++ 类,它具有进行计算的成员函数。我们可以使用 SWIG 生成包装器代码:
// MyClass.h
class MyClass {
public:
int compute(int a, int b);
};modules MyModule {
interface MyClass {
function compute(a, b);
};
};然后我们可以用 Go 代码调用 MyClass:
package main
// #cgo CFLAGS: -I../cpp
// #cgo LDFLAGS: -L../cpp -lMyModule
// #include "MyModule_wrap.h"
import "C"
func main() {
obj := MyClass_new()
defer MyClass_delete(obj)
result := int(C.MyClass_compute(obj, 10, 20))
println(result)
}通过使用 CGO 或 SWIG,我们可以轻松地将原生代码与 Go 应用程序集成,从而扩展框架的功能并与底层系统进行交互。









