在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之后模板就不会变了。。。

最后追查至此,现在已经修改了模板的热加载机制解决这个冲突。

希望给同学们提个醒,留意此坑。


hengfeiyang
1.7k 声望290 粉丝