当前位置: 首页 > 面试题库 >

Golang模板(并将函子传递给模板)

司马奇希
2023-03-14
问题内容

尝试访问传递给模板的函数时出现错误:

Error: template: struct.tpl:3: function "makeGoName" not defined

有人可以让我知道我在做什么错吗?

模板文件(struct.tpl):

type {{.data.tableName}} struct {
  {{range $key, $value := .data.tableData}}
  {{makeGoName $value.colName}} {{$value.colType}} `db:"{{makeDBName $value.dbColName}},json:"{{$value.dbColName}}"`
  {{end}}
}

调用文件:

type tplData struct {
    tableName string
    tableData interface{}
}

func doStuff() {
    t, err := template.ParseFiles("templates/struct.tpl")
    if err != nil {
        errorQuit(err)
    }

    t = t.Funcs(template.FuncMap{
        "makeGoName": makeGoName,
        "makeDBName": makeDBName,
    })

    data := tplData{
        tableName: tableName,
        tableData: tableInfo,
    }

    t.Execute(os.Stdout, data)
}

func makeGoName(name string) string {
    return name
}

func makeDBName(name string) string {
    return name
}

这是用于生成struct样板代码的程序(以防万一有人想知道为什么我要在模板中这样做)。


问题答案:

自定义函数需要在解析模板之前进行注册,否则解析器将无法分辨标识符是否为有效的函数名。模板被设计为可静态分析的,这是必需的。

您可以先使用创建一个新的未定义模板template.New(),并且除了
函数 之外,类型(由返回)还具有 方法
,您可以调用该方法。template.ParseFiles()
template.TemplateNew()Template.ParseFiles()



像这样:

t, err := template.New("").Funcs(template.FuncMap{
    "makeGoName": makeGoName,
    "makeDBName": makeDBName,
}).ParseFiles("templates/struct.tpl")

请注意,该template.ParseFiles()函数还会template.New()在后台调用,将第一个文件的名称作为模板名称传递。

Template.Execute()返回error,打印以查看是否未生成任何输出,例如:

if err := t.Execute(os.Stdout, data); err != nil {
    fmt.Println(err)
}


 类似资料:
  • 我知道接受参数和,所以我已经尝试了2次(失败)来包装函数和args...: a.创建一个C样式的函数,该函数将调用传递给它的对象: 这会在GCC 4.8.5中导致以下错误: /usr/include/c++/4.8.2/functional:在'struct std::_bind_simple(std::_placeholder<1>,int))(int*)>>()>'的实例化中:/usr/inc

  • 如果ngFor循环使用带有then/else语法的模板,如何将ngFor循环中的当前变量传递给ngIf? 当内联使用时,它们似乎通过罚款,但不能从模板访问,例如: 模板似乎根本无法访问,但如果内联使用,它可以工作。 在下面的链接中有一个工作和不工作版本的完整例子

  • 问题内容: 我正在建立一个包括条目之间关系的通讯簿。我为个人,公司,场地和角色有单独的模型。在我的索引页面上,我想列出每个模型的所有实例,然后对其进行过滤。这样一个人可以轻松地搜索和查找条目。我已经能够使用通用视图列出单个模型,并使用get_extra_context显示另一个模型: 我还可以使用自定义视图列出单个模型: 这是这两个测试的urls.py: 所以我的问题是“如何修改此参数以将更多模型

  • 我有一个自定义函数,我想在刀片模板中传递它。这里是功能: 用法如下: 是否可以将自定义功能传递给刀片模板?非常感谢。

  • 是否可以通过context将对象(比方说User(包含3个字符串属性-name、password、detail)传递给thymeleaf模板,并从模板中访问它的属性,例如 ? 如果是这样,我该怎么做? 匿名用户 如果你正在使用spring和thymeleaf,那么它们应该像魅力一样为你工作。在这种情况下,它非常简单: 其中myTemplate引用,其内容如下所示: 和我的实体 和我使用的沉香酒的版

  • 问题内容: 我的Webapp导航系统中有一个表格,每次呈现页面时,该表格都会填充最新信息。如何避免在每个代码中放置以下代码? 用于填充表格。该表将显示在每个页面上 问题答案: 您可以使用Flask的上下文处理器将全局变量注入到Jinja模板中 这是一个例子: 为了将新变量自动注入模板的上下文中,Flask中存在上下文处理器。上下文处理器在呈现模板之前运行,并且能够将新值注入到模板上下文中。上下文处