包裹
" />
本文介绍两种在 Go 中将多行文本逐行包裹为 <div> 标签的实用方法:一种使用 bufio.Scanner 逐行读取并手动处理空行,另一种结合 html/template 实现声明式渲染,并通过字符串替换统一处理空行。代码简洁、可扩展性强,适用于 HTML 内容生成场景。
本文介绍两种在 go 中将多行文本逐行包裹为 `
在 Web 开发或服务端模板渲染中,常需将纯文本按行结构化为 HTML 块级元素(如 <div>)。Go 语言标准库提供了高效、安全的工具来完成这一任务。下面介绍两种推荐方案,均能正确处理非空行与空行(后者应渲染为 <div><br/></div>)。
方案一:使用 bufio.Scanner + bytes.Buffer(推荐)
这是最直观、可控性最强的方式。bufio.Scanner 按行读取输入流(支持任意 io.Reader,包括 strings.NewReader),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")
}
}
// 可选:检查扫描错误(如 I/O 错误)
if err := scanner.Err(); err != nil {
panic(err)
}
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))
}✅ 优势:逻辑清晰、易于调试;空行判断明确;天然支持大文本流式处理。
⚠️ 注意:scanner.Text() 不包含换行符,且自动跳过 \r\n / \n,无需额外 trim;但若原始文本含 \r 未被清理,建议先用 strings.TrimSpace(line) 确保一致性。
方案二:使用 html/template + 后处理
适合已将文本预分割为 []string 的场景,借助 Go 模板引擎实现语义化渲染,再统一修正空 <div></div>。
package main
import (
"bytes"
"fmt"
"html/template"
"strings"
)
func wrapLinesWithTemplate(lines []string) string {
buf := &bytes.Buffer{}
tmpl := template.Must(template.New("wrap").Parse(`{{range .}}<div>{{.}}</div>
{{end}}`))
err := tmpl.Execute(buf, lines)
if err != nil {
panic(err)
}
// 将空 div 替换为含 <br/> 的版本
return strings.ReplaceAll(buf.String(), "<div></div>\n", "<div><br/></div>\n")
}
func main() {
lines := []string{
"Lorem ipsum dolor sit amet,",
"consectetur adipiscing elit.",
"",
"Nam eget lectus porta metus aliquam tincidunt sed vel enim.",
}
fmt.Print(wrapLinesWithTemplate(lines))
}✅ 优势:模板解耦内容与结构,便于后续扩展(如添加 class、escape HTML);适合批量处理结构化行数据。
⚠️ 注意:strings.ReplaceAll 是简单替换,若原文中可能真实出现 <div></div>\n 字符串(极罕见),需改用更健壮的解析方式(如 golang.org/x/net/html);此外,模板默认会对 . 进行 HTML 转义,如需原样输出,应使用 {{. | printf "%s"}} 或自定义 template.FuncMap 控制转义行为。
总结
- 日常使用首选方案一:轻量、可靠、无依赖,适合绝大多数场景。
- 复杂模板需求选方案二:当需集成 CSS 类、属性绑定或与其他模板共用时更具可维护性。
- 无论哪种方式,务必对用户输入做 XSS 防护——若内容不可信,应在插入前调用 template.HTMLEscapeString() 或使用 template.HTML 类型显式标记可信内容。
最终输出严格匹配预期格式,每行独立成 <div>,空行渲染为 <div><br/></div>,符合 HTML 语义与浏览器渲染规范。

















