
本文介绍如何在 go web 应用中,将用户关联的多个银行名称(bankname)安全、高效地拼接为逗号分隔字符串,并通过 html 模板渲染为结构化表格,避免 xss 风险与模板逻辑混乱。
本文介绍如何在 go web 应用中,将用户关联的多个银行名称(bankname)安全、高效地拼接为逗号分隔字符串,并通过 html 模板渲染为结构化表格,避免 xss 风险与模板逻辑混乱。
在 Go Web 开发中,直接在 HTML 模板中处理字符串拼接(如 range 循环 + 条件判断加逗号)不仅可读性差,还易引入空值或重复分隔符问题。最佳实践是:在 Go 后端完成数据预处理,再传递给模板——即「逻辑在 Go,展示在 HTML」。
✅ 推荐方案:结构体建模 + 后端拼接 + 模板渲染
首先定义清晰的数据结构(推荐使用 json.Unmarshal 解析原始 JSON):
type Account struct {
ID string `json:"Id"`
BankName string `json:"BankName"`
BankDetails string `json:"BankDetails"`
AccNum string `json:"AccNum"`
}
type User struct {
ID string `json:"Id"`
Name string `json:"Name"`
Accounts []Account `json:"Account"`
}
// Helper method to generate comma-separated bank names
func (u *User) BankNames() string {
var names []string
for _, acc := range u.Accounts {
if acc.BankName != "" {
names = append(names, strings.TrimSpace(acc.BankName))
}
}
return strings.Join(names, ",")
}
⚠️ 注意:BankName 可能含前后空格或为空字符串,务必过滤;strings.Join 安全可靠,不会产生尾随/前置逗号。
接着,在 HTTP handler 中解析 JSON 并准备模板数据:
func usersHandler(w http.ResponseWriter, r *http.Request) {
jsonData := `{
"Id":"1",
"Name":"haihello",
"Account": [
{"Id":"","BankName":"Citi","BankDetails":"wsafa, asraa","AccNum":"15321"},
{"Id":"","BankName":" Deutsche","BankDetails":"aaaaa,aaa","AccNum":"14566"}
]
}` // 实际应从 DB 或 API 获取
var user User
if err := json.Unmarshal([]byte(jsonData), &user); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
tmpl := template.Must(template.ParseFiles("users.html"))
tmpl.Execute(w, struct {
Users []User
}{Users: []User{user}})
}
? HTML 模板(users.html)
使用 Go html/template,禁止使用 {{.BankNames}} 直接输出未转义内容(若 BankName 含 <script> 将导致 XSS)。应调用安全方法或使用 template.FuncMap 注册自定义函数:</script>
<title>User Accounts</title>
| Name | Has_Account_in |
|---|---|
| {{.Name | html}} | {{.BankNames | html}} |
✅ | html 过滤器自动转义 HTML 特殊字符(如 ),保障前端安全。
? 若需更灵活拼接(如去重、排序),可在 BankNames() 方法中增强逻辑(例如用 map[string]bool 去重)。
❌ 不推荐做法(避免!)
- 在模板内用 {{range}} 手动拼接:易出错、不可复用、难以测试;
- 将原始 JSON 字符串传给前端用 JS 处理:绕过 Go 类型安全与服务端校验,增加 XSS 风险;
- 忽略空值或空格导致显示 "Citi,, Deutsche" 等异常格式。
✅ 总结
- 结构先行:用 Go struct 显式建模 JSON,提升可维护性与 IDE 支持;
- 逻辑后置:字符串拼接、去重、过滤等操作应在 Go 层完成;
- 模板极简:HTML 模板只负责布局与安全输出,不承担业务逻辑;
- 安全第一:始终使用 | html 或 | js 等转义管道,防范注入攻击。
遵循此模式,你不仅能正确渲染 haihello → "Citi,Deutsche",还能轻松扩展支持分页、搜索、银行图标等高级功能。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











