Go语言提供了两种定义多行字符串字面量的方式,分别是反引号包裹的原始字符串字面量和双引号拼接的解释型字符串字面量,不同的定义方式对应不同的缩进规则,需要开发者根据实际使用场景选择合适的写法。

Go多行字符串的两种定义方式
原始字符串字面量(raw string literal)
使用反引号`包裹的字符串属于原始字符串字面量,这种字符串会保留所有换行和缩进字符,不会处理转义序列,语法格式如下:
package main
import "fmt"
func main() {
// 原始字符串字面量,保留所有换行和缩进
sql := `SELECT
id,
name,
age
FROM user
WHERE age > 18`
fmt.Println(sql)
}
解释型字符串字面量(interpreted string literal)
使用双引号"包裹的字符串属于解释型字符串字面量,本身不支持直接换行,需要通过加号拼接多行内容,会处理转义序列,语法格式如下:
package main
import "fmt"
func main() {
// 解释型字符串字面量拼接多行
sql := "SELECT n" +
" id,n" +
" name,n" +
" agen" +
"FROM usern" +
"WHERE age > 18"
fmt.Println(sql)
}
多行字符串的缩进规范
原始字符串字面量的缩进规则
原始字符串字面量会完全保留反引号内的所有字符,包括换行符和空格缩进,因此如果为了代码对齐在字符串内部添加缩进,这些缩进会被直接输出到字符串内容中。如果字符串内容本身不需要缩进,建议将字符串内容左对齐,反引号单独占一行,示例如下:
package main
import "fmt"
func main() {
// 内容不需要缩进时,左对齐字符串内容
config := `{
"host": "127.0.0.1",
"port": 8080
}`
fmt.Println(config)
}
如果字符串内容本身需要保留缩进(比如JSON、HTML、SQL等格式要求缩进的内容),则按照内容本身的格式要求缩进即可,不需要额外为了代码对齐添加多余缩进。
解释型字符串字面量的缩进规则
解释型字符串字面量通过拼接实现多行,每一行的缩进需要手动添加到拼接的字符串片段中,缩进规则完全由内容本身决定,代码层面的缩进不影响字符串最终内容,示例如下:
package main
import "fmt"
func main() {
// 内容需要缩进时,手动在拼接片段中添加缩进
html := "<div>n" +
" <p>内容</p>n" +
"</div>"
fmt.Println(html)
}
多行字符串的最佳实践
优先选择原始字符串字面量
在大多数场景下,优先使用原始字符串字面量定义多行字符串,因为不需要处理转义字符,写起来更简洁,尤其是包含大量特殊字符(如双引号、反斜杠)的内容,比如JSON、HTML、正则表达式等,使用原始字符串可以避免大量的转义操作。
避免为了代码对齐添加多余缩进
很多开发者为了让代码看起来整齐,会在原始字符串字面量内部添加和代码块对齐的缩进,这会导致字符串内容多出不必要的空格,尤其是当字符串内容是要输出的文本、要执行的SQL语句时,多余的缩进可能会引发错误。如果确实需要代码对齐,可以使用字符串修剪函数处理,示例如下:
package main
import (
"fmt"
"strings"
)
func main() {
// 代码对齐导致字符串有多余缩进,使用TrimSpace处理
msg := `
这是一段多行文本
第二行内容
`
// 去除首尾的空白字符
fmt.Println(strings.TrimSpace(msg))
}
长字符串考虑拆分定义
如果多行字符串内容过长,或者需要在多个地方复用,可以将其拆分成多个部分定义,或者单独放到一个变量中,避免大段字符串直接写在函数逻辑里影响代码可读性。如果是需要动态拼接的内容,可以使用fmt.Sprintf或者strings.Builder来构建,示例如下:
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
builder.WriteString("SELECTn")
builder.WriteString(" id, namen")
builder.WriteString("FROM usern")
builder.WriteString("WHERE status = 1")
sql := builder.String()
fmt.Println(sql)
}
特殊场景的处理方式
如果字符串内容中需要包含反引号,那么原始字符串字面量无法直接使用,此时只能使用解释型字符串字面量,通过转义的方式处理反引号,示例如下:
package main
import "fmt"
func main() {
// 内容包含反引号,使用解释型字符串字面量转义
str := "这是一个包含反引号的字符串:`test`"
fmt.Println(str)
}
常见错误示例
以下是开发者经常出现的错误写法,需要尽量避免:
- 在原始字符串字面量中为了代码对齐添加多余缩进,导致输出内容异常
- 在原始字符串字面量中使用转义字符,比如
n会被当成普通字符输出,不会换行 - 解释型字符串字面量忘记拼接加号,导致语法错误
遵循以上规范和最佳实践,就可以在Go开发中正确、规范地使用多行字符串字面量,既保证代码的可读性,也避免字符串内容出现格式错误。
Go多行字符串字符串字面量缩进规范raw_string_literal修改时间:2026-07-16 12:24:30