Go模板中如何打印含转义字符的原始文本?
Go模板保留原始转义字符输出的解决方法
你的场景是:结构体中Data字段的字符串包含\r\n转义序列,但用{{ .Data }}渲染时,转义序列被解析成了实际换行,想要保持原始的\r\n字符输出。
Go模板没有直接的内置功能实现这个需求,但可以通过两种方式解决:
方法一:预双重转义字符串
在给Data赋值时,把反斜杠再转义一次(写成\\r\\n),这样模板渲染时,输出的就是原始的\r\n:
strct.Data = "{ \"hello\": \"ok\", \\r\\n \"text\": \"value\" }"
此时用{{ .Data }}渲染,就能得到你想要的输出:
value = `{ "hello": "ok", \r\n "text": "value" }`
方法二:自定义模板转义函数
如果不想修改原始字符串,可以自定义一个模板函数,将字符串中的控制字符(如回车、换行)转义回对应的转义序列:
- 定义转义函数:
import "bytes" func escapeSpecialChars(s string) string { var buf bytes.Buffer for _, c := range s { switch c { case '\r': buf.WriteString("\\r") case '\n': buf.WriteString("\\n") // 可按需添加其他需要转义的字符,比如\t、\"等 default: buf.WriteRune(c) } } return buf.String() }
- 注册函数到模板并使用:
tpl := template.Must(template.New("tpl").Funcs(template.FuncMap{ "escape": escapeSpecialChars, }).Parse(`value = "{{ escape .Data }}"`))
渲染时调用{{ escape .Data }},即可保留原始转义字符输出。
内容的提问来源于stack exchange,提问作者Rafael Smith
相关产品推荐
相关产品推荐

