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中的输出看起来像这样

Screenshot%20from%202019-08-15%2016-00-21

以下是我的控制器,我使用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

5 回复

好的,谢谢您的帮助

更多关于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()
}

关键点:

  1. 在原始字符串中直接使用双引号,无需转义
  2. 移除不必要的字符串替换操作(如替换换行符)
  3. 确保模板语法正确,所有模板变量 {{.Field}} 都能在数据模型中找到对应字段
  4. 验证模板输出是否为有效的JSON格式

如果仍然遇到引号显示问题,检查Gin框架的响应处理,确保返回的是正确的字符串内容而非被二次编码。

回到顶部