包裹标签
" />
本文介绍两种在 Go 中将多行字符串按行分割并分别用 标签包裹的实用方法:一种使用 bufio.Scanner + bytes.Buffer 精确处理空行为 ,另一种结合 html/template 实现声明式渲染,并通过字符串替换补全空行语义。
本文介绍两种在 go 中将多行字符串按行分割并分别用 `
`,另一种结合 `html/template` 实现声明式渲染,并通过字符串替换补全空行语义。
在 Web 内容生成或模板预处理场景中,常需将纯文本按自然换行(\n)拆分为独立 HTML 块元素。Go 语言本身不提供开箱即用的“行级 HTML 封装”函数,但可通过标准库灵活组合实现。以下是两种推荐方案:
方案一:bufio.Scanner + bytes.Buffer(推荐用于精确控制)
该方法逐行扫描输入流,对空行显式转换为
,语义清晰、内存高效,适合处理大文本或流式输入:
package main
import (
"bufio"
"bytes"
"fmt"
"strings"
)
func wrapLinesWithDiv(text string) string {
r := strings.NewReader(text)
buf := &bytes.Buffer{}
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := scanner.Text()
if line == "" {
buf.WriteString("<div><br></div>\n")
} else {
buf.WriteString("<div>" + line + "</div>\n")
}
}
return buf.String()
}
func main() {
input := `Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Nam eget lectus porta metus aliquam tincidunt sed vel enim.`
fmt.Print(wrapLinesWithDiv(input))
}
✅ 优势:
- 自动跳过 \r(兼容 Windows 换行 \r\n);
- 空行严格映射为 ,符合预期语义;
- 无额外依赖,性能稳定。
方案二:html/template + 切片预处理(适合结构化数据)
当输入已为 []string 或需复用模板逻辑时,可先按 \n 分割,再交由 template 渲染。注意:空字符串会生成
,需后置替换:package main
import (
"bytes"
"fmt"
"html/template"
"strings"
)
func wrapLinesWithTemplate(lines []string) (string, error) {
const tpl = `{{range .}}<div>{{.}}</div>
{{end}}`
t := template.Must(template.New("lineWrap").Parse(tpl))
var buf bytes.Buffer
if err := t.Execute(&buf, lines); err != nil {
return "", err
}
// 将空 div 替换为含 <br> 的版本
return strings.ReplaceAll(buf.String(), "<div></div>", "<div><br></div>"), nil
}
func main() {
input := `Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Nam eget lectus porta metus aliquam tincidunt sed vel enim.`
lines := strings.Split(input, "\n")
result, _ := wrapLinesWithTemplate(lines)
fmt.Print(result)
}
⚠️ 注意事项:
- strings.Split() 不自动处理末尾换行符,若原文以 \n 结尾,会产生额外空行;建议用 strings.Split(strings.TrimRight(input, "\n"), "\n") 防御性处理;
- template 方案需注意 HTML 转义(本例未启用 .Escaped,如输入含 & 应改用 template.HTMLEscapeString 或启用自动转义);
- 两种方法均未对原始文本做 XSS 过滤,生产环境务必结合 html.EscapeString 或专用 sanitizer 库(如 bluemonday)。
无论选择哪种方式,核心原则是:明确区分内容行与空白行语义,并确保输出符合 HTML 规范。对于简单脚本或 CLI 工具,方案一更直接;若项目已大量使用 template,方案二更易维护。











