在Go1.8的开发过程中有一个提交,标题是:
html/template, text/template: clarify template redefinition behavior
描述是:
Make two important points clearer:
- Giving a template definition containing
nothing but spaces has no effect.
- Giving a template definition containing
non-spaces can only be done once per template.
Fixes #16912.
Fixes #16913.
Fixes #17360.
看起来没什么特别的,但是如果你使用了一些基于Go template包的模板解析,升级到Go1.8之后可能会遇到模板热编译不能工作了,不要问我是怎么知道的?
从1.8开始,同一个非空的模板不允许在执行后再次解析。
我们有这样的代码:
package main
import (
"html/template"
"log"
"os"
"time"
)
func main() {
body := `
<html>
this is first {{ . }}
</html>
`
body2 := `
<html>
this is second {{ . }}
</html>
`
tmpl, err := template.New("name").Parse(body)
if err != nil {
log.Fatalln(err)
}
err = tmpl.Execute(os.Stdout, time.Now())
if err != nil {
log.Fatalln(err)
}
_, err = tmpl.Parse(body2)
if err != nil {
log.Fatalln(err)
}
err = tmpl.Execute(os.Stdout, time.Now())
if err != nil {
log.Fatalln(err)
}
}
在Go1.7之前都是可以工作的,1.8会抛出Error:
html/template: cannot Parse after Execute
Baa 的模板渲染 render 在开发模式下,任何模板的变更都会刷新渲染,可是升级到1.8之后模板就不会变了。。。
最后追查至此,现在已经修改了模板的热加载机制解决这个冲突。
希望给同学们提个醒,留意此坑。