go中多行字符串优先用反引号,原样保留内容、天然支持跨行、零转义;双引号需拼接或转义换行,不支持原生多行;二者可互为逃生通道处理引号冲突。

Go里写多行字符串,优先用反引号;双引号只能靠拼接或转义换行,没法天然支持多行。
反引号字符串:原样保留、跨行自由、零转义
反引号(`)包裹的是原生字符串字面量(raw string literal),内容不经过任何转义解析——
、 、"、\ 全部按字面输出。它天然支持跨行,回车、缩进、空格全数保留。
- 适合场景:SQL 模板、HTML 片段、正则表达式、嵌入的配置文本、带格式的日志模板
- 注意 Windows 换行:
中的会被 Go 自动丢弃,只留,所以跨平台行为一致 - 不能嵌套反引号:字符串里出现
`会直接报错,必须拆开拼接或换用双引号处理局部 - 示例:
query := `SELECT * FROM users WHERE name = "Alice" AND age > 18`—— 双引号不用转义,换行也可直接写
双引号字符串:支持转义但不支持原生换行
双引号(")字符串是解释型字面量(interpreted string literal),
、 、"、 等都会被解析;但它**不允许直接换行**,否则编译失败。
- 要实现“逻辑多行”,只能用
+拼接:"line1 " + "line2 " + "line3" - 或手动插入
:"line1 line2 line3"—— 但缩进和视觉对齐完全丢失 - 优势在于需要动态插值时可配合
fmt.Sprintf或strings.Replace,而反引号无法直接插值(得用fmt.Sprintf包一层) - 错误示例:
s := "hello world"
→ 编译报错:newline in string
混合引号场景:双引号里有反引号 or 反引号里有双引号
两者互为逃生通道:只要字符串里只有一种引号,就优先用另一种包裹,避免转义。
- 含双引号但无反引号 → 用反引号:
msg := `He said, "Hi there!"` - 含反引号但无双引号 → 用双引号并转义:
msg := "She typed `ls -la` to list files" - 两者都有 → 必须拆分拼接:
text := `pre "` + `"mid"` + ` post`,或改用fmt.Sprintf - 别试图在反引号里写
`—— 它不识别任何转义,`就是两个字符:和`,不是“转义反引号”
容易忽略的关键细节
反引号字符串末尾的换行符也会被计入长度,比如 `` 是空字符串,而 ` `(含一个换行)长度是 1;用 strings.TrimSpace 前得先确认是否真要删掉首尾空白。另外,反引号不支持变量插值,想拼接变量得用 fmt.Sprintf 或 +,而不是像模板引擎那样写 `Hello, ${name}` —— 那在 Go 里根本不存在。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











