Golang中如何转义多行字符串模板中的引号
Golang中如何转义多行字符串模板中的引号 大家好,我需要帮助在文本模板中打印双引号。
以下是我的模板
package templates
//SecretJSON2 包含密钥json的变量 var SecretJSON2 =
{ \"apiVersion\": \"v1\", \"kind\": \"Secret\", \"metadata\": { \"name\": \"{{.Name}}\", \"namespace\": \"{{.Namespace}}\", }, \"type\": \"Opaque\", \"data\": { \"private.key\": \"{{.PrivateKey}}\", \"public.key\": \"{{.PublicKey}}\" } }
也尝试过不使用反斜杠
package templates
//SecretJSON2 包含密钥json的变量
var SecretJSON2 = { "apiVersion": "v1", "kind": "Secret", "metadata": { "name": "{{.Name}}", "namespace": "{{.Namespace}}", }, "type": "Opaque", "data": { "private.key": "{{.PrivateKey}}", "public.key": "{{.PublicKey}}" } }
但在Postman中的输出看起来像这样

以下是我的控制器,我使用Gin作为框架
package controllers
import (
“bytes”
“encoding/json”
“html/template”
“siranga/models”
“siranga/templates”
“strings”
)
var secret2 models.Secrets2
//Secret2Controller 函数
func Secret2Controller(val []byte) string { tmpl := template.Must(template.New("certificate-tmpl").Parse(strings.Replace(templates.SecretJSON2, "\n", "", -1))) err := json.Unmarshal(val, &secret2) if err != nil { panic(err) } var temp bytes.Buffer err = tmpl.Execute(&temp, secret2) result := temp.String() return result }//Secrets2Handler 处理DeploymentController
func Secrets2Handler(c *gin.Context) { value, err := ioutil.ReadAll(c.Request.Body) if err != nil { panic(err) } results := controllers.Secret2Controller(value) fmt.Println("result", results) c.JSON(http.StatusOK, results) }
我期望的输出应该是这样的
{ "apiVersion": "v1",
"kind": "Secret",
"metadata": {
"name": "drupal-secret",
"namespace": "verizon",
},
"type": "Opaque",
"data": {
"private.key": "1234567890-sdfghjkldfghjk45678",
"public.key": "sdfghjkjhg56789"
}
}
更多关于Golang中如何转义多行字符串模板中的引号的实战教程也可以访问 https://www.itying.com/category-94-b0.html
那么应该怎么做呢?你能帮我一下吗?
你在将一个已经是JSON格式的字符串编码为JSON字符串。
不需要对secret进行json.Marshal处理…
func main() {
fmt.Println("hello world")
}
c.JSON() 会调用 json.Marshal。你可以传入能够序列化成所需格式的内容,或者使用上下文中的某个方法来直接发送响应,但那样你可能需要记得正确设置编码格式。
func main() {
fmt.Println("hello world")
}
在Go语言中处理文本模板中的引号转义时,需要使用正确的转义方法。对于原始字符串字面量(使用反引号 ` 定义),反斜杠 \ 不会被解释为转义字符,因此直接使用双引号即可。问题可能出现在模板解析或JSON输出处理上。
以下是修正后的代码示例:
模板文件 (templates.go):
package templates
// SecretJSON2 包含密钥json的变量
var SecretJSON2 = `{
"apiVersion": "v1",
"kind": "Secret",
"metadata": {
"name": "{{.Name}}",
"namespace": "{{.Namespace}}"
},
"type": "Opaque",
"data": {
"private.key": "{{.PrivateKey}}",
"public.key": "{{.PublicKey}}"
}
}`
控制器文件 (controllers.go):
package controllers
import (
"bytes"
"encoding/json"
"html/template"
"siranga/models"
"siranga/templates"
)
var secret2 models.Secrets2
func Secret2Controller(val []byte) string {
tmpl := template.Must(template.New("secret").Parse(templates.SecretJSON2))
err := json.Unmarshal(val, &secret2)
if err != nil {
panic(err)
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, secret2)
if err != nil {
panic(err)
}
return buf.String()
}
处理JSON输出的改进版本:
func Secret2Controller(val []byte) string {
tmpl := template.Must(template.New("secret").Parse(templates.SecretJSON2))
err := json.Unmarshal(val, &secret2)
if err != nil {
panic(err)
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, secret2)
if err != nil {
panic(err)
}
// 验证输出是否为有效JSON
var jsonCheck map[string]interface{}
if err := json.Unmarshal(buf.Bytes(), &jsonCheck); err != nil {
panic(err)
}
return buf.String()
}
关键点:
- 在原始字符串中直接使用双引号,无需转义
- 移除不必要的字符串替换操作(如替换换行符)
- 确保模板语法正确,所有模板变量
{{.Field}}都能在数据模型中找到对应字段 - 验证模板输出是否为有效的JSON格式
如果仍然遇到引号显示问题,检查Gin框架的响应处理,确保返回的是正确的字符串内容而非被二次编码。

