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>

关键点:

  1. router.SetFuncMap()必须在router.LoadHTMLGlob()router.LoadHTMLFiles()之前调用
  2. 自定义函数可以处理多种类型输入,增强健壮性
  3. 在模板中使用{{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}}
回到顶部