Это валидная javscript-запись для строки [{"ID":"1"}]
Но можно сделать красивее:
https://play.golang.org/p/brmFG2PGJDpackage main
import (
"bytes"
"fmt"
"html/template"
"log"
)
func main() {
out := bytes.NewBuffer([]byte{})
t, err := template.New("foo").Parse(`<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var data = JSON.parse( {{.}} );
</script>
</head>
<body>
</body>
</html>`)
if err != nil {
log.Fatal("Cannot parse the template: ", err)
}
err = t.Execute(out, `[{"ID":"1"}]`)
if err != nil {
log.Fatal("Cannot execute the template: ", err)
}
fmt.Println(string(out.Bytes()))
}
А можно ещё красивее:
https://play.golang.org/p/Ir4wLhHMuVpackage main
import (
"bytes"
"fmt"
"html/template"
"log"
)
type A []struct {
ID string
}
func main() {
out := bytes.NewBuffer([]byte{})
t, err := template.New("foo").Parse(`<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var data = {{.}};
</script>
</head>
<body>
</body>
</html>`)
if err != nil {
log.Fatal("Cannot parse the template: ", err)
}
data := A{
{ID: "1"},
}
err = t.Execute(out, data)
if err != nil {
log.Fatal("Cannot execute the template: ", err)
}
fmt.Println(string(out.Bytes()))
}
Причина в том, что т.к. Go не может полностью распарсить грамматику js, он подстраховывается, чтобы случайно не допустить code injection.
Go видит скобки и понимает, что ему надо вставить содержимое строкового литерала js, но т.к. он не может полностью гарантировать, что мы будем внутри скобок, то подстраховывается и эскейпит управляющие символы, чтобы в случае ошибки js просто остановился, но не выполнил вставленный код.
Шаблоны нацелены только на вставку данных и должны гарантировать программисту, что эти данные не будут выполнены как код (если конечно вы сами там eval не вставите).