是否可以从 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 转义的:
在解析时,每个 . 都会被覆盖以根据需要添加转义函数。
在<script>
标签内,.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 函数?的主要内容,如果未能解决你的问题,请参考以下文章