在go模板中使用转义字符打印

sdnqo3pr  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(162)

假设我有一个参数,它的值是一个带有一系列转义字符的字符串:

strct.Data = "{ \"hello\": \"ok\", \r\n \"text\": \"value\" }"

当我在模板中打印时,假设模板标记为:

value = `{{ .Data }}`

渲染输出变为:

value = `{ "hello": "ok",
"text": "value"
}`

是否有任何内置功能允许打印RAW文本(完全按原样打印)?以便实现以下输出:

value = `{ "hello": "ok", \r\n "text": "value" }`
ltskdhd1

ltskdhd11#

编译器解释反斜杠转义。转义序列在运行时不存在。
要打印带有Go语言字符串转义序列的字符串,可以使用printf函数和引号动词,注意这里打印的是\"

data := "{ \"hello\": \"ok\", \r\n \"text\": \"value\" }"
t := template.Must(template.New("").Parse("value = {{printf \"%q\" .Data }}"))
t.Execute(os.Stdout, struct{ Data string }{data})
// Output: data := "{ \"hello\": \"ok\", \r\n \"text\": \"value\" }"

https://go.dev/play/p/2g8pGdEMkqx
要获得问题中请求的输出,请在将字符串传递给模板之前用转义序列替换回车和换行符。

var repl = strings.NewReplacer("\r", `\r`, "\n", `\n`)

func main() {
    data := "{ \"hello\": \"ok\", \r\n \"text\": \"value\" }"
    data = repl.Replace(data)
    t := template.Must(template.New("").Parse("value = `{{ .Data }}`"))
    t.Execute(os.Stdout, struct{ Data string }{data})
}
// Ouptput: value = `{ "hello": "ok", \r\n "text": "value" }`

https://go.dev/play/p/_eySCGZnHkA
另一种选择是在原始字符串中包含反斜杠:

data := "{ \"hello\": \"ok\", \\r\\n \"text\": \"value\" }"
t := template.Must(template.New("").Parse("value = `{{ .Data }}`"))
t.Execute(os.Stdout, struct{ Data string }{data})
// Output: value = `{ "hello": "ok", \r\n "text": "value" }`

https://go.dev/play/p/xTdecKbS0fn

相关问题