
使用 strings.Replace 将连续的两个换行符 \n\n 替换为单个换行符 \n,是 Go 中简洁、高效且符合惯用法(idiomatic)的空行移除方式,适用于大多数纯文本场景。
使用 `strings.replace` 将连续的两个换行符 `\n\n` 替换为单个换行符 `\n`,是 go 中简洁、高效且符合惯用法(idiomatic)的空行移除方式,适用于大多数纯文本场景。
在 Go 中处理多行字符串时,若需移除其中的空白行(即仅含换行符、不含可见字符的行),最惯用(idiomatic)的方式并非先分割再过滤(如 strings.Split + 循环判断 + strings.TrimSpace),而是利用换行符的结构特征直接替换——将 \n\n 替换为 \n。
这是因为空白行在 Unix 风格换行的字符串中,本质表现为两个相邻的 \n(例如 "line1\n\nline2"),而首尾或中间的孤立 \n 并不会构成“空行”误判。strings.Replace(s, "\n\n", "\n", -1) 以无限制次数(-1)执行全局替换,简洁、零分配(不引入切片或新 slice)、语义清晰,且完全避免正则表达式等重量级依赖。
示例代码如下:
package main
import (
"fmt"
"strings"
)
func main() {
s := `line 1
line 2
line 3
line 4`
// 移除所有空白行:将 \n\n → \n
cleaned := strings.Replace(s, "\n\n", "\n", -1)
fmt.Println(cleaned)
}
输出:
line 1 line 2 line 3 line 4
⚠️ 注意事项:
- 此方法仅移除“连续换行符”形成的空行,对含空白字符(如空格、制表符)的“伪空行”(如 "\n\t\n" 或 "\n \n")无效;若需严格清除所有视觉上为空的行,应结合 strings.FieldsFunc 或逐行处理:
lines := strings.Split(s, "\n") var nonEmpty []string for _, line := range lines { if strings.TrimSpace(line) != "" { nonEmpty = append(nonEmpty, line) } } cleaned = strings.Join(nonEmpty, "\n") - Windows 换行符(\r\n)需额外适配:可先统一标准化为 \n(strings.ReplaceAll(s, "\r\n", "\n")),再执行 \n\n 替换;
- 原字符串若以 \n 开头或结尾,该方法不会自动裁剪首尾空行;如需同时清理,可组合 strings.TrimSpace。
总结:对于标准 Unix/LF 换行、且空行严格由 \n\n 构成的场景,strings.Replace(s, "\n\n", "\n", -1) 是最 Go 式(idiomatic)、高效且可读性极佳的解决方案。











