将 Golang 变量分配给 Javascript

Sre*_*ova 6 javascript json go go-templates

目前我遇到了与将 Golang 变量分配给 Javascript 变量相关的问题。我使用的是 Golang 模板,所以,从后端我发送了一个 JSON 变量,就像这样:

 var c []models.C
 b, _ := json.Marshal(c)
 err = tpl.ExecuteTemplate(w, "index.gohtml",string(b))
Run Code Online (Sandbox Code Playgroud)

如您所见,我有一个切片,将其转换为 Json,然后将该 Json 转换为字符串,然后将其发送到模板。然后,在前端,我需要将它分配给一个变量,它应该是有效的 JSON,我有这个:

var rowData = {{.}};
Run Code Online (Sandbox Code Playgroud)

但是,我得到 SyntaxError: expected property name, got '{'

所以,我的问题是:我应该如何分配那个 JSON?

icz*_*cza 9

首先,您必须使用html/template代替text/template,因为前者提供上下文敏感的转义。

其次,在模板中,上下文必须清楚它是 JavaScript 代码,例如它必须在 HTML<script>标签内。

请参阅此工作示例:

type Point struct {
    Name string
    X, Y int
}

func main() {
    t := template.Must(template.New("").Parse(src))

    p := Point{"Center", 100, 200}
    pj, err := json.Marshal(p)
    if err != nil {
        panic(err)
    }

    if err = t.Execute(os.Stdout, string(pj)); err != nil {
        panic(err)
    }
}

const src = `<script>
var point = {{.}};
alert(point);
</script>`
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

<script>
var point = "{\"Name\":\"Center\",\"X\":100,\"Y\":200}";
alert(point);
</script>
Run Code Online (Sandbox Code Playgroud)

如您所见,pointJavaScript 变量包含正确转义的有效 JSON 文本(JavaScript 对象)。