首页 >后端开发 >Golang >为什么'ZgotmplZ”出现在我的 Go 模板输出中,如何修复它?

为什么'ZgotmplZ”出现在我的 Go 模板输出中,如何修复它?

Linda Hamilton
Linda Hamilton原创
2024-12-25 11:46:42489浏览

Why Does

模板输出问题:理解“ZgotmplZ”

使用 Go 模板渲染 HTML 时,您可能会在输出中遇到“ZgotmplZ”的令人困惑的外观。这个模糊的值源于一项安全措施,该措施检测运行时到达某些上下文(例如 CSS 或 URL)的不安全内容。

考虑这个示例:

func main() {
    funcMap := template.FuncMap{
        "printSelected": func(s string) string {
            if s == "test" {
                return `selected="selected"`
            }
            return ""
        },

        "safe": func(s string) template.HTML {
            return template.HTML(s)
        },
    }
    template.Must(template.New("Template").Funcs(funcMap).Parse(`
    <option {{ printSelected "test" }} {{ printSelected "test" | safe }} >test</option>
    `)).Execute(os.Stdout, nil)
}

此模板将生成以下内容输出:

<option ZgotmplZ ZgotmplZ >test</option>

“ZgotmplZ”的存在表明不安全内容selected=“selected”已经到达CSS 语境。为了处理这种情况,您可以在模板函数映射中添加“safe”和“attr”函数:

    funcMap := template.FuncMap{
        "attr": func(s string) template.HTMLAttr {
            return template.HTMLAttr(s)
        },
        "safe": func(s string) template.HTML {
            return template.HTML(s)
        },
    }

使用这些函数,您可以按如下方式修改模板:

<option {{.attr | attr}}>test</option>
    {{.html | safe}}

通过此修改,输出将是:

<option selected="selected">test</option>
<option selected="selected">option</option>

此解决方案可确保不安全内容在包含在 输出。您还可以考虑定义自定义函数将字符串转换为其他类型,例如 template.CSS、template.JS 和 template.URL,以增强安全性并维护代码组织。

以上是为什么'ZgotmplZ”出现在我的 Go 模板输出中,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn