gotpl
gotpl 是一个 Rust 库,它通过 Go 语言的 FFI (Foreign Function Interface) 完整地将 Go 强大的 text/template 和 html/template 引擎引入 Rust 生态系统。这意味着你可以在 Rust 项目中利用 Go 模板的丰富功能和成熟的生态,同时享受 Rust 的安全和性能。
✨ 特性
- 完整的 Go 模板支持:在 Rust 中使用 Go 语言原生的
text/template和html/template语法和功能,包括条件、循环、函数、嵌套模板等。 - HTML 安全性:通过
html/template模式自动进行 HTML 转义,有效防止 XSS 攻击,确保渲染内容的安全性。 - 灵活的数据绑定:接受任何实现
serde::Serializetrait 的 Rust 数据结构(如struct、enum、serde_json::Value),自动将其序列化为 JSON 传递给 Go 模板。 - 清晰的错误处理:将 Go 模板渲染过程中产生的错误转换为 Rust 的
Result类型,提供详细的错误信息。 - 零额外依赖:在 Rust 端仅依赖
serde和serde_json进行数据序列化,Go 模板引擎是内置的。 - 内存安全:通过 FFI 边界的内存管理机制,确保 Go 分配的字符串内存能被 Rust 正确释放,避免内存泄漏。
🚀 快速开始
安装
将 gotpl 添加到你的 Cargo.toml:
[]
= "0.1.0" # 替换为最新版本
= { = "1.0", = ["derive"] }
= "1.0"
示例
下面是一个简单的例子,展示如何在 Rust 中渲染一个 Go 模板:
use render_template;
use ;
use json;
🌐 Go 模板语法
gotpl 完全支持 Go 语言的 text/template 和 html/template 语法。你可以查阅官方文档了解更多细节:
一些常用的 Go 模板语法示例:
// 变量访问
Hello, !
// 条件语句
Welcome, Admin!Welcome, User.
// 循环 (迭代 slice 或 map)
<ul>
<li></li>
</ul>
// 嵌套字段访问
Your address:
// 函数调用 (Go 模板内置函数,例如 len, index, print, printf 等)
Number of items:
🛠️ 构建过程
gotpl 内部通过 go build -buildmode=c-archive 命令将 Go 代码编译成一个 C 静态库,然后使用 bindgen 工具为这个 C 库生成 Rust FFI 绑定。这个过程在 build.rs 中自动化完成。
要求:
- Go 语言环境: 确保你的系统上安装了 Go 语言编译器 (版本 1.18 或更高)。
- Rust 工具链: 确保安装了 Rust 和 Cargo。
当你运行 cargo build 时,build.rs 会自动执行以下步骤:
- 切换到
src/go_ffi目录。 - 运行
go build -o ../../target/go_lib/libgo_ffi.a -buildmode=c-archive ffi.go将 Go 代码编译为静态库。 - 使用
bindgen从src/go_ffi/ffi.go中的 Cgo 注释生成 Rust 绑定。 - 将生成的绑定文件放置在
OUT_DIR中,以便lib.rs可以include!它。
⚠️ 注意事项
- 性能考量:FFI 调用会带来一定的开销。对于需要极高性能渲染的场景,可能需要评估 Go 模板的适用性。
- Go 运行时:虽然将 Go 代码编译为 C 静态库,但它仍然包含 Go 运行时。这意味着你的二进制文件会略微增大。
- 内存管理:Go 模板渲染的结果字符串是在 Go 运行时中分配的 C 字符串。
gotpl确保在 Rust 端使用完毕后,通过FreeResultString函数将这些内存安全地交还给 Go 运行时释放,防止内存泄漏。
🤝 贡献
欢迎通过 Pull Requests 或 Issues 贡献代码、报告 Bug 或提出功能建议。
📜 许可证
gotpl 采用 MIT 许可证。详见 LICENSE 文件。