【问题标题】:Dynamic fields with Go html template带有 Go html 模板的动态字段
【发布时间】:2021-04-28 08:19:25
【问题描述】:

我可以在 go 中使用动态属性制作 html 模板吗?

像这样的例子目前会导致错误

无效模板:模板:sticker.CellRepresentation:1:23:在 <.sticker_set.url> 处执行“sticker.CellRepresentation”:无法在类型接口 {}

中评估字段 url
func sample() error {
    tpl, err := template.New("sample").Parse(`<a href="${sticker_set.url}">{{.sticker_set.url}}</a>`)
    if err != nil {
        return err
    }

    data := map[string]interface{}{
        "sticker_set": map[string]interface{}{
            "url": "x",
        },
    }

    if err := tpl.Execute(NoopWriter{}, data); err != nil {
        return fmt.Errorf("Invalid template: %w", err)
    }

    return nil
}

func main() {
    err := sample()
    if err != nil {
        panic(err)
    }
}

我没有使用结构,因为我尝试执行的模板使用的是在编译时未定义的结构的 json

【问题讨论】:

  • 问题中的代码不会产生引用的错误:play.golang.org/p/xWbjObZCF9h。请分享您遇到问题的实际代码。
  • @mkopriva 哦,真的,我的错。我发布的代码是一个简单的版本,但它是我实际执行的那个,除了我将原始代码保留在 main 之后并想在它之前插入一个 return 以快速分析什么问题是。没有注意到这段代码实际上是有效的,而后面的原始代码导致了原因,因为模板是相同的
  • 如果您仍然无法解决问题,请随时使用重现错误的代码示例更新问题。
  • 我进行了快速搜索,如果您尝试访问 nil 的内容,则会显示该错误。
  • @TehSphinX 类似的东西实际上是问题所在,尽管在我的情况下它不是 nil 而是一个空字符串

标签: go go-templates go-html-template


【解决方案1】:

你的例子对我和操场都很好。我稍微调整了模板,并使用os.stdout 作为作者。

func sample() error {
    tpl, err := template.New("sample").Parse(`<a href="{{.sticker_set.url}}">{{.sticker_set.url}}</a>`)
    if err != nil {
        return err
    }

    data := map[string]interface{}{
        "sticker_set": map[string]interface{}{
            "url": "xyz",
        },
    }

    if err := tpl.Execute(os.Stdout, data); err != nil {
        return fmt.Errorf("Invalid template: %w", err)
    }

    return nil
}

甚至尝试了不同的值类型:Playground

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 2023-03-19
    • 2014-06-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多