docs.rs failed to build gotpl-0.1.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build:
gotpl-0.2.6
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 文件。