Golang中如何向HTML模板添加FuncMap
Golang中如何向HTML模板添加FuncMap
package routes
import (
homeCtrl "aio-commerce/internal/modules/home/controllers"
"fmt"
"github.com/gin-gonic/gin"
"html/template"
"strconv"
)
func formatNumber(value string) string {
s, err := strconv.Atoi(value)
formatted := ""
if err == nil {
formatted = fmt.Sprintf("%.0f", s)
}
return formatted
}
func Routes(router *gin.Engine) {
homeController := homeCtrl.New()
router.SetFuncMap(template.FuncMap{
"formatNumber": formatNumber,
})
router.GET("/", homeController.Index)
}
<div>
<div>
<h2><a href="/products/{{.Code}}">{{ .Title}}</a></h2>
<h4>{{ .ShortNotes }}</h4>
<div>
<div>
<h4> {{ formatNumber .Price }}</h4>
</div>
</div>
</div>
</div>
更多关于Golang中如何向HTML模板添加FuncMap的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
错误信息是:模板: home.tmpl:52: 函数 “formatNumber” 未定义
我已经创建了函数
//func Routes(router *gin.Engine) {
// homeController := homeCtrl.New()
// router.SetFuncMap(template.FuncMap{
// "formatNumber": formatNumber,
// })
// router.GET("/", homeController.Index)
}
更多关于Golang中如何向HTML模板添加FuncMap的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好 @amansu,欢迎来到论坛。
text/template 的文档中有一个 FuncMap 示例,这能帮你解决问题吗?
如果不能,你能描述一下你遇到的具体问题吗(错误信息、预期行为与实际行为的差异等)?
提供一个最小但完整的代码示例也会很有帮助。给出的代码无法编译,并且没有展示模板是如何执行的。理想情况下,代码示例应该能在 playground 中运行。
另外一个小提示:在论坛中分享代码时,请在代码的开头和结尾使用单独一行的三个反引号,像这样:
```go
// 在此处添加 Go 代码
```
或者,如示例所示,在开头的反引号后加上单词 go。
这样代码将保留所有缩进格式,并应用语法高亮。
在Golang中使用Gin框架向HTML模板添加FuncMap的代码是正确的,但需要确保模板加载在设置FuncMap之后。以下是完整的示例:
package main
import (
"github.com/gin-gonic/gin"
"html/template"
"strconv"
"fmt"
)
func formatNumber(value interface{}) string {
var num int
switch v := value.(type) {
case string:
n, err := strconv.Atoi(v)
if err != nil {
return v
}
num = n
case int:
num = v
case float64:
num = int(v)
default:
return fmt.Sprintf("%v", v)
}
return fmt.Sprintf("%d", num)
}
func main() {
router := gin.Default()
// 设置FuncMap
router.SetFuncMap(template.FuncMap{
"formatNumber": formatNumber,
})
// 加载模板(必须在SetFuncMap之后)
router.LoadHTMLGlob("templates/*")
router.GET("/", func(c *gin.Context) {
c.HTML(200, "index.html", gin.H{
"Title": "Product",
"Price": "1234567",
"Code": "P001",
"ShortNotes": "Product description",
})
})
router.Run(":8080")
}
HTML模板文件(templates/index.html):
<!DOCTYPE html>
<html>
<head>
<title>{{.Title}}</title>
</head>
<body>
<div>
<h2><a href="/products/{{.Code}}">{{.Title}}</a></h2>
<h4>{{.ShortNotes}}</h4>
<div>
<h4>Formatted Price: {{formatNumber .Price}}</h4>
</div>
</div>
</body>
</html>
关键点:
router.SetFuncMap()必须在router.LoadHTMLGlob()或router.LoadHTMLFiles()之前调用- 自定义函数可以处理多种类型输入,增强健壮性
- 在模板中使用
{{formatNumber .Price}}调用自定义函数
如果使用多个自定义函数:
router.SetFuncMap(template.FuncMap{
"formatNumber": formatNumber,
"uppercase": strings.ToUpper,
"add": func(a, b int) int { return a + b },
})
在模板中:
{{uppercase .Title}}
{{add 5 3}}

