是否可以从 golang 结构返回 javascript 函数?

Posted

技术标签:

【中文标题】是否可以从 golang 结构返回 javascript 函数?【英文标题】:Is it posible to return javascript function from golang struct? 【发布时间】:2022-01-19 00:28:42 【问题描述】:

下面的例子是一个 golang 结构

type Column struct 
        Data            string      `json:"data"`
        Title           string      `json:"title"`
        Type            string      `json:"type"`
        Class           string      `json:"class"`
        Visible         bool        `json:"visible"`
        Render          template.JS `json:"render"`


func (c *Column) SetValue() 
        // code below is flexible depend on condition but here i keep it simple.
        c.Render = template.JS(`function(data, type, row)  if(type === 'display') return $.fn.dataTable.render.text().display(data); return data;`);

这里是 golang 模板中的 javascript

<script>
    $(function () 
        console.log(.Columns, wantedobj);
    );
</script>

这里是 chrome 开发者工具。

左列表是来自上述结构的格式值。 正确的列表是我想要的格式。

关于 render 是否有任何可能的方法来获取 javascript 函数而不是字符串? (请看右图的渲染

【问题讨论】:

【参考方案1】:

使用template.JS 是正确的。您的问题是,在 html 模板中,值是根据 contexts 转义的:

在解析时,每个 . 都会被覆盖以根据需要添加转义函数。

&lt;script&gt; 标签内,.Columns 等结构值被渲染为 JSON。现在,由于template.JS 只是在string 上定义的类型,所以当您将Columns 编组为JSON 时,Render 字段将保留其字符串表示形式。

如果您直接打印Render,它将显示为未引用的Javascript:

console.log(.Columns.Render); // unescaped JS function

现在您可能会考虑在Columns 上实现MarshalJSON 以将Render 呈现为未转义的Javascript,但这将不再是有效的JSON。函数不是 JSON 数据类型。它只能是一个字符串。一种选择是改用 text/template 包,但它不会再逃避 anything 了。或者使用单个字段构造 Javascript 对象:

<script>
    $(function () 
        const foo = 
            data: .Columns.Data,
            render: .Columns.Render
        
        console.log(foo);
    );
</script>

【讨论】:

这是一个很好的答案,但我建议不要使用模板将数据传递给 JavaScript,NightOwl。很难正确地进行转义,也很难调试。我更喜欢编写静态 javascript 并使用 API 调用从后端提取数据。

以上是关于是否可以从 golang 结构返回 javascript 函数?的主要内容,如果未能解决你的问题,请参考以下文章

[Go] golang http下返回json数据

golang 对特定域名根据内网域名是否可以访问返回特定的IP

golang os清空返回值

Golang basic_leamingM 2023 1

golang 并发函数怎么返回

golang 从 map 获取值时的值拷贝问题