反引号字符串是原生字符串字面量,不解析任何转义序列(如 、 ),其中的反斜杠和字母均作为普通字符;它保留所有空白和换行,但禁止出现未转义的反引号。

反引号字符串为什么不会解析
和
因为反引号包裹的是原生字符串字面量(raw string literal),Go 编译器在词法分析阶段就跳过所有转义处理——
就是两个字符: 和 n,不是换行符; 同理。这和双引号字符串的解释逻辑完全不同。
常见错误现象:
- 写
s := `hello world`,期望输出两行,结果却打印出hello world(五个可见字符) - 用
regexp.Compile时误用双引号写正则`d+`,实际得写成`\d+`或直接`d+`(反引号里不需要转义反斜杠)
所以当你需要真实换行,就得靠回车本身:
msg := `line one line two line three`
这个 msg 里天然含两个
字符,长度是 21(含换行符),不是 19。
立即学习“go语言免费学习笔记(深入)”;
双引号字符串跨行必须拼接或手动插入
双引号字符串不允许物理换行,否则编译报错:newline in string。它只接受逻辑换行,靠 + 拼接或显式
插入。
使用场景:
- 需要变量插值,比如
"Hello, " + name + "!" - 构建带动态内容的 SQL 片段(但更推荐用参数化查询)
- 日志消息中混入
fmt.Sprintf动词,如fmt.Sprintf("user %s logged in at %v", u.Name, time.Now())
注意缩进问题:下面这段代码会把空格和换行全塞进字符串里,极难维护:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
s := "SELECT id, name" +
" FROM users" +
" WHERE active = 1"
不如直接用反引号写 SQL,再用 fmt.Sprintf 套一层做插值。
反引号里出现 ` 会直接编译失败
反引号字符串不支持任何转义,包括 ` —— 它根本不是合法语法。只要字符串内容里有单个 `,就必须拆开。
可选方案:
- 局部换双引号:
text := `pre "` + `"mid"` + ` post` - 用
fmt.Sprintf统一收口:fmt.Sprintf(`pre "%s" post`, mid) - 若 mid 是固定字符串,且含双引号和反引号,考虑改用
strings.ReplaceAll替换占位符
别试 `she said `hi`` —— Go 不认这种写法,连编译都过不去。
末尾换行符和首尾空白容易被忽略
反引号字符串会原样保留开头、中间、结尾的所有空白,包括行首缩进和最后一行的换行。例如:
s := `hello world `
这个 s 长度是 12(hello
world
),末尾那个换行是真实字符。调试时用 fmt.Printf("%q", s) 能看清。
容易踩的坑:
- 模板生成 JSON 时多出换行,导致格式非法
- SQL 查询末尾多了
,某些驱动报语法错误 - 用
strings.TrimSpace前没意识到它会干掉所有首尾空白,可能误删关键缩进
如果真要“干净”多行,宁可用 + 拼接,或者明确用 strings.Join 控制分隔符。

















