我的所有模板都有一个变量,指示其关联图像的根 url。我想在模板主体中的图像文件名之前输出该根目录,但是当我这样做时,模板包会尝试在其周围加上引号。这是显示我的问题的最小代码。 IMG_ROOT是本例中的一个接口(interface),可以更好的模拟真实代码。脚本类型是文本/模板,因为它的内容将在 underscore.js 模板中使用。不过,类型似乎并不影响它的输出方式。
package main
import (
"html/template"
"os"
)
type Data struct {
IMG_ROOT interface{}
}
const tmpl = `
<body>
<script type="text/template">
<img src="{{.IMG_ROOT}}/file_name.jpg"></img>
</script>
</body>
`
func main() {
t, _ := template.New("").Parse(tmpl)
t.Execute( os.Stdout, &Data{ template.JSStr( "/path/to/file" ) } )
}
http://play.golang.org/p/wg9JK2w2lt
如果我写 <img src="{{.IMG_ROOT}}/file_name.jpg"></img> , 我得到 "\/path\/to\/file/file_name.jpg"这是无效的。
如果我写 <img src={{.IMG_ROOT}}/file_name.jpg></img> , 我得到 "/path/to/file/"file_name.jpg这也不起作用。
有解决办法吗?我已经尝试使用 IMG_ROOT 类型的模板包中的每个“安全”类型,但没有任何运气。我可以编写一个连接并返回根和文件的函数,但似乎应该有一个更简单的解决方案。
有什么想法吗?
谢谢!
最佳答案
您可以使用 printf 内置函数:
<img src={{printf "%s/file_name.jpg" .IMG_ROOT}}></img>
http://play.golang.org/p/2v8Q6wHu0r
但相反,我建议创建一个自定义辅助函数并使用它来创建这样的路径:
const ImageRoot = "path/to/files/"
func StaticFile(filename string) string {
return ImageRoot + filename
}
func main() {
t, _ := template.New("").Funcs(template.FuncMap{"staticFile": StaticFile}).Parse(tmpl)
t.Execute(os.Stdout, nil)
}
然后在您的模板中您可以这样做
<img src="{{staticFile "image.jpg"}}"></img>
关于templates - 转到 HTML 模板 : Can I stop the templates package inserting quotes around strings in scripts?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411880/