尽管我猜这可能是Go模板中的一个错误,并提交了一个问题:
https://github.com/golang/go/issues/38895
我想在这里问一下Go的html/模板的"设计"行为,尤其是它带有<script>
标签的规则。见下文:
package main
import (
"fmt"
"html/template"
"os"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
u := User{1, "xrfang"}
//without <script>
t, _ := template.New("body").Parse("var u = {{.}}")
t.Execute(os.Stdout, u)
fmt.Println()
//with <script>
t, _ = template.New("body").Parse("<script>/*var u1 = {{.}}*/ var u2 = {{.}}</script>")
t.Execute(os.Stdout, u)
fmt.Println()
}
没有<script>
的模板生成的字符串与go的%+v
fmt字符串的输出相同。但是<script>
版本生成的JSON,和/* ... */
之间的代码会自动删除??
没有生成字符串的模板与go的%+v fmt字符串的输出相同。但该版本生成了JSON,代码介于/*…*/之间是否自动删除??
是。这是故意的。html/template中的转义是上下文特定的,因为它必须是上下文特定才能安全,正如包文档中所解释的那样。