Go 模板正在向输出添加额外的引号

Go template is adding extra quotes to output

我想在 Go 模板中按原样使用我的变量值,但 Go 在它周围添加了额外的引号。例如,对于像

这样的 Go 模板

{{.Site}}:{{.Port}}/{{.Path}}

我想得到输出为

Mysite:3000/from/here

但模板却给了我以下内容:

"Mysite":"3000"/"from/here"

所以,

根据Go HTML template doc

HTML templates treat data values as plain text which should be encoded so they can be safely embedded in an HTML document. The escaping is contextual, so actions can appear within JavaScript, CSS, and URI contexts.

The security model used by this package assumes that template authors are trusted, while Execute's data parameter is not. More details are provided below.

这意味着只要go HTML模板引擎检测到它在<script>标签内,就会启用JavaScript转义,(即与是否使用正则无关) " 或不像第一个评论者认为的那样)。所以

得到输出为

Mysite:3000/from/here

而不是:

"Mysite":"3000"/"from/here"

不要<script> & </script> 标签包装它。 在 模板 Execute().

之后执行串联

同样,使用 <script> & </script> 标签环绕,我得到:

var url = `"Mysite":"3000"/"from/here"/${othervars}?"orgId=1\u0026refresh=30s"`

对比没有 <script> & </script> 标签环绕它,我得到:

var url = `Mysite:3000/from/here/${othervars}?orgId=1&amp;refresh=30s`

正是我需要的。

然而,我的实际情况是我正在使用 go HTML 模板引擎来处理我的 .html 模板文件,所以我不能在之后真正进行连接,因为所有内容都在中定义.html 模板文件。因此,正如 Martin Gallagher 在他的代码中所展示的那样,对于这种情况,使用模板函数似乎是唯一的选择。

但即使那样也可能不是一个可行的选择,因为这是我从 Martin 的代码中得到的:

var url = "Mysite:3000\/from\/here?orgId=1\u0026refresh=30s"

还是不是我想要的:

var url = `Mysite:3000/from/here/${othervars}?orgId=1&amp;refresh=30s`

所以可能对于这种情况,确实没有理想的解决方案。