如何在 Go 模板中正确渲染 bson.ObjectId
技术百科
聖光之護
发布时间:2026-01-16
浏览: 次 在 go web 开发中,若结构体字段为 `bson.objectid` 类型,可直接在 html 模板中调用其 `hex()` 方法获取十六进制字符串,无需预先转换或冗余存储。
Go 的 html/template 包支持对模板上下文中的值调用其公开方法(只要该方法无参数、返回值可被模板安全渲染)。bson.ObjectId 正是如此——它提供了 Hex() 方法,用于返回 24 位小写十六进制字符串(如 "5f8a1b2c3d4e5f6789012345"),这正是 URL 路由和前端交互所需的格式。
假设你有如下结构体与模板数据:
type Test struct {
Id bson.ObjectId
Name string
Foo string
}在 handler 中传递数据时保持原样即可:
data := Test{
Id: bson.NewObjectId(),
Name: "Example Item",
Foo: "bar",
}
tmpl.Execute(w, data)在 HTML 模板中,直接使用 .Id.Hex 即可安全输出 ID 字符串:
{{ .Name }}
Foo: {{ .Foo }}
Remove me
⚠️ 注意事项:
- 确保 Id
字段非零(即 !Id.Valid() 时 Hex() 会返回空字符串),生产环境建议在模板中添加安全判断(需配合自定义函数或预处理);
- Hex() 返回的是纯字符串,不带引号,可直接用于 URL、data-id 属性等场景;
- 不要尝试 {{ string(.Id) }} 或 {{ printf "%s" .Id }} —— bson.ObjectId 未实现 Stringer 接口,此类写法会编译失败或触发 panic;
- 若使用较新 MongoDB 驱动(如 go.mongodb.org/mongo-driver/bson/primitive.ObjectID),则应改用 .Hex()(方法名一致,但类型不同),注意驱动迁移兼容性。
总结:模板内方法调用是 Go 模板的强大特性之一。合理利用 bson.ObjectId.Hex,既能保持数据结构的语义清晰,又能避免控制器层不必要的类型转换,使代码更简洁、可维护性更高。
# 的是
# 更高
# 所需
# 此类
# 自定义
# 你有
# 又能
# 可直接
# 数据结构
# go
# 路由
# String
# html
# 字符串
# 接口
# printf
# 不带
# 前端
# 结构体
# 类型转换
# mongodb
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何减少Golang内存碎片化_Golang内存分
- 为什么Go需要go mod文件_Go go mod
- php串口通信波特率怎么选_根据硬件手册设置正确波
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- Win11怎么开启智能存储_Windows11存储
- VSC怎样在Linux运行PHP_Ubuntu系统
- 如何在Golang中配置代码格式化工具_使用gof
- 小程序里php怎么变mp4_小程序调用php生成m
- Windows10无法识别USB设备描述符请求失败
- Win10如何卸载预装Edge扩展_Win10卸载
- php能控制zigbee模块吗_php通过串口与c
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- c++怎么使用std::unique实现去重_c+
- Windows10系统怎么查看硬盘健康_Win10
- 如何理解Go指针和内存分配关系_Go Pointe
- c++ std::future和std::prom
- Win11怎么关闭开机声音_Win11系统启动提示
- Python并发安全问题_资源竞争说明【指导】
- Windows服务持续崩溃怎样修复_系统服务保护机
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- c++如何利用doxygen生成开发文档_c++
- Win11怎么退出微软账户_切换Win11为本地账
- Windows7如何安装系统镜像_Windows7
- php打包exe后无法读取环境变量_变量配置方法【
- c# 在高并发场景下,委托和接口调用的性能对比
- phpstudy本地环境mysql忘记密码_重置m
- php文件怎么变mp4保存_php输出视频流保存为
- 如何使用Golang reflect检查方法数量_
- Win11系统更新后黑屏怎么办 Win11更新黑屏
- php删除数据怎么清空表_truncate与del
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- 如何在Golang中编写异步函数测试_Golang
- Mac上的iMovie如何剪辑视频?(新手入门教程
- 如何使用Golang捕获并记录协程panic_保证
- Win11系统占用空间大怎么办 Win11深度瘦身
- PhpStorm怎么调试PHP代码_PhpStor
- Bpmn 2.0的XML文件怎么画流程图
- 如何在Golang中处理数据库事务错误_回滚和日志
- Win11怎么设置ipv4地址_Windows 1
- Win11怎么查看显卡显存_查询Win11显卡详细
- Win11怎么更改任务栏位置_修改注册表将Win1
- Win11怎么自动隐藏任务栏_Win11全屏显示设
- php8.4新语法match怎么用_php8.4m
- 如何用正则表达式精确匹配“start”到“end”
- Python音视频处理高级项目教程_FFmpegP
- Windows 10怎么隐藏特定更新补丁_Wind
- windows 10专注助手怎么关闭_window
- Win11怎么设置任务栏透明_Windows11使
- Win11怎么设置默认PDF阅读器 Win11修改
- Linux如何使用grep搜索文件内容_Linux


QQ客服