我正在用Golang Echo Labstack框架构建一个前端网站,我想在模板视图中调用一些自定义函数.如何使用Echo?

例如,我可以用杜松子wine 来做这个

func main() {
    r := gin.Default()
    r.SetFuncMap(template.FuncMap{
        // Add my custom functions
        "AddTS": util.AddTS,
        "Encrypt": util.EncryptGeneral,
        "CombineVariable": util.CombineVariable,
    })
    
    r.Static("/static", "./static")
    r.LoadHTMLFiles("static/*/*") //  load the static path
    r.LoadHTMLGlob("templates/*/*")

    route.Routes(r)
    r.Run()
}

在我的模板视图中,我可以像这样简单地调用任何自定义函数.

range {{ .Data }}
    <div>
        {{ .data_value | AddTS }}
        {{ .data_value | OtherCustomFunction }}
    </div>
{{ end }}

但我似乎在Echo中找不到类似的方法,我如何实现一个可以在模板视图中使用的全局函数?

这是我当前的Echo文件

type TemplateRenderer struct {
    templates *template.Template
}

func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {

    // Add global methods if data is a map
    if viewContext, isMap := data.(map[string]interface{}); isMap {
        viewContext["reverse"] = c.Echo().Reverse
    }

    return t.templates.ExecuteTemplate(w, name, data)
}

func main() {
    e := echo.New()

    renderer := &TemplateRenderer{
        templates: template.Must(template.ParseGlob("templates/*/*.tmpl")),
    }
    e.Renderer = renderer

    e.Static("/static", "static")
    
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    e.Logger.Fatal(e.Start(":8183"))
}

*由于某些原因,我不能在这个项目中使用Gin,只能使用Echo.

谢谢.

推荐答案

如指南here中所述,您可以轻松实现自己的渲染器,并使用Go自己的html/template软件包来管理模板:

import (
    "html/template"
    // ...
)

type TemplateRenderer struct {
    templates *template.Template
}

func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {

    // Add global methods if data is a map
    if viewContext, isMap := data.(map[string]interface{}); isMap {
        viewContext["reverse"] = c.Echo().Reverse
    }

    return t.templates.ExecuteTemplate(w, name, data)
}

为了让模板能够访问自定义函数,您可以使用Funcs方法,如下所示:

renderer := &TemplateRenderer{
    templates: template.Must(template.New("t").Funcs(template.FuncMap{
        "AddTS":           util.AddTS,
        "Encrypt":         util.EncryptGeneral,
        "CombineVariable": util.CombineVariable,
    }).ParseGlob("templates/*/*.tmpl")),
}

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

获取作为类型参数传递给方法接收方中的类型参数的切片的基础类型

仅呈现一个模板的GIN Web应用程序

如何给杜松子wine 的路由加上一个名字,比如Laravel ?

创建服务时云运行触发器执行失败

Golang String

正确使用pgtype的方法

Kafka架构注册表-Broker:Broker无法验证记录

Golang在不写入磁盘的情况下为jpeg图像生成一致的哈希

如何从 nil 指针创建值

如何获取集群外go Kubernetes客户端的当前命名空间?

在 Go 中将元数据从一个 JPEG 复制到另一个

Go - 永远停止带有上下文的循环

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

没有任务角色的 AWS CDK ECS 任务定义

将 big.Int 转换为 [2]int64,反之亦然和二进制补码

通用函数与外部包中的常见成员一起处理不同的 struct ?

Golang 泛型同时具有接口和实现

try 创建新的 etcdv3 客户端时出现pc error: code = Unavailable desc = error reading from server: EOF

同一个 Go struct成员上的多个标签