golang用户输入数据清洗与校验插件库conform的使用
Golang用户输入数据清洗与校验插件库conform的使用
Conform是一个用于处理用户输入的Golang库,它可以通过结构体标签来修剪、清理和修改字符串字段。
功能概述
Conform可以帮助你快速修复和格式化用户输入的字符串,而无需编写额外的函数。它特别适合处理表单数据,如姓名、电子邮件地址、URL slugs等需要格式化的字段。
安装
使用以下命令安装conform:
go get github.com/leebenson/conform
然后在代码中导入:
import "github.com/leebenson/conform"
基本用法
示例1:格式化电子邮件地址
package main
import (
"fmt"
"github.com/leebenson/conform"
)
type UserForm struct {
Email string `conform:"email"`
}
func main() {
input := UserForm{
Email: " POORLYFormaTTED@EXAMPlE.COM ",
}
conform.Strings(&input) // 传入结构体指针
fmt.Println(input.Email) // 输出 "poorlyformatted@example.com"
}
示例2:多种格式化操作
type Person struct {
FirstName string `conform:"name"`
LastName string `conform:"ucfirst,trim"`
Email string `conform:"email"`
CamelCase string `conform:"camel"`
UserName string `conform:"snake"`
Slug string `conform:"slug"`
Blurb string `conform:"title"`
Left string `conform:"ltrim"`
Right string `conform:"rtrim"`
Skills []string `conform:"upper"`
Examples map[string]string `conform:"!html"`
}
p1 := Person{
" LEE ",
" Benson",
" LEE@LEEbenson.com ",
"I love new york city",
"lee benson",
"LeeBensonWasHere",
"this is a little bit about me...",
" Left trim ",
" Right trim ",
[]string{"HtmL", "Yaml"},
map[string]string{"<best>":"<body><p>I know this & that.</p></body>"},
}
p2 := p1 // 复制Person结构体到新变量
conform.Strings(&p2) // 执行格式化操作
/*
格式化结果:
FirstName: ' LEE ' -> 'Lee'
LastName: ' Benson' -> 'Benson'
Email: ' LEE@LEEbenson.com ' -> 'lee@leebenson.com'
CamelCase: 'I love new york city' -> 'ILoveNewYorkCity'
UserName: 'lee benson' -> 'lee_benson'
Slug: 'LeeBensonWasHere' -> 'lee-benson-was-here'
Blurb: 'this is a little bit about me...' -> 'This Is A Little Bit About Me...'
Left: ' Left trim ' -> 'Left trim '
Right: ' Right trim ' -> ' Right trim',
Skills: { 'HtmL', 'Yaml' } -> { 'HTML', 'YAML' },
Examples: { '<best>': '<body><p>I know this & that.</p></body>' } -> { '<best>': '<body><p>I know this & that.</p></body>' }
*/
与Gorilla Schema配合使用
import (
"net/http"
"time"
"github.com/gorilla/schema"
"github.com/leebenson/conform"
)
type newUserForm struct {
FirstName string `schema:"firstName" conform:"name"`
Email string `schema:"emailAddress" conform:"email"`
Password string `schema:"password"` // 没有conform标签,不做处理
Dob time.Time `schema:"dateOfBirth"` // 非字符串字段会被conform忽略
}
func ProcessNewUser(r *http.Request) error {
form := new(newUserForm)
schema.NewDecoder().Decode(form, r.PostForm) // Gorilla Schema解码
conform.Strings(form) // Conform格式化
// ...
}
支持的标签
Conform支持多种格式化标签,可以组合使用:
基本格式化
trim
- 去除首尾空格ltrim
- 去除左侧空格rtrim
- 去除右侧空格lower
- 转换为小写upper
- 转换为大写title
- 转换为标题格式
特殊格式
camel
- 转换为驼峰命名snake
- 转换为下划线命名slug
- 转换为URL友好的slug格式ucfirst
- 首字母大写name
- 格式化姓名(去除特殊字符,正确格式化多部分姓名)email
- 格式化电子邮件地址
内容过滤
num
- 只保留数字!num
- 去除数字alpha
- 只保留字母!alpha
- 去除字母!html
- 转义HTML!js
- 转义JavaScript
注意事项
- Conform会原地修改结构体中的字符串字段,会覆盖原有的数据
- 只会处理带有
conform
标签的字符串字段 - 不会修改map的键,只会修改值
- 非字符串字段会被忽略
Conform不提供验证功能,可以与govalidator或validator等验证库配合使用。
更多关于golang用户输入数据清洗与校验插件库conform的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang用户输入数据清洗与校验插件库conform的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 数据清洗与校验插件库 Conform 使用指南
Conform 是一个轻量级的 Go 库,专门用于数据清洗和校验。它可以对结构体字段进行标准化处理,如去除空格、大小写转换、HTML 标签清理等。
安装 Conform
go get github.com/leebenson/conform
基本使用
1. 定义结构体并添加标签
type User struct {
Name string `conform:"name"` // 将姓名格式化为首字母大写
Email string `conform:"email"` // 将电子邮件转为小写
Username string `conform:"trim"` // 去除用户名两端的空格
Bio string `conform:"trim,upper"` // 去除空格并转为大写
HTML string `conform:"strip"` // 去除HTML标签
}
2. 使用 Conform 处理数据
package main
import (
"fmt"
"github.com/leebenson/conform"
)
func main() {
user := User{
Name: " john doe ",
Email: "John@EXAMPLE.COM",
Username: " user123 ",
Bio: " <p>This is a bio</p> ",
HTML: "<script>alert('xss')</script><p>Content</p>",
}
// 清洗数据
if err := conform.Strings(&user); err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Name: %q\n", user.Name) // "John Doe"
fmt.Printf("Email: %q\n", user.Email) // "john@example.com"
fmt.Printf("Username: %q\n", user.Username) // "user123"
fmt.Printf("Bio: %q\n", user.Bio) // "THIS IS A BIO"
fmt.Printf("HTML: %q\n", user.HTML) // "Content"
}
支持的转换器
Conform 提供了多种内置的转换器:
trim
- 去除两端空格ltrim
- 去除左端空格rtrim
- 去除右端空格lower
- 转为小写upper
- 转为大写title
- 每个单词首字母大写name
- 姓名格式(首字母大写)email
- 电子邮件格式(转为小写)snake
- 转为 snake_casecamel
- 转为 camelCaseucfirst
- 首字母大写strip
- 去除 HTML 标签num
- 只保留数字字符
自定义转换器
你可以注册自己的转换器:
package main
import (
"fmt"
"github.com/leebenson/conform"
"strings"
)
func init() {
// 注册自定义转换器
conform.RegisterCustom("reverse", func(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
})
}
type Data struct {
Text string `conform:"reverse"`
}
func main() {
data := Data{Text: "hello"}
conform.Strings(&data)
fmt.Println(data.Text) // 输出 "olleh"
}
嵌套结构体处理
Conform 可以递归处理嵌套的结构体:
type Address struct {
Street string `conform:"trim,title"`
City string `conform:"trim,title"`
}
type Person struct {
Name string `conform:"name"`
Address Address `conform:"nested"`
}
func main() {
person := Person{
Name: " john smith ",
Address: Address{
Street: " 123 main st ",
City: " new york ",
},
}
conform.Strings(&person)
fmt.Printf("Name: %q\n", person.Name) // "John Smith"
fmt.Printf("Street: %q\n", person.Address.Street) // "123 Main St"
fmt.Printf("City: %q\n", person.Address.City) // "New York"
}
错误处理
Conform 会返回错误,你可以捕获并处理:
type Invalid struct {
Field int `conform:"trim"` // 不能对非字符串字段使用字符串转换器
}
func main() {
data := Invalid{Field: 123}
if err := conform.Strings(&data); err != nil {
fmt.Println("Error:", err) // 会输出错误
}
}
性能考虑
Conform 使用反射来处理结构体,对于性能敏感的场景,建议:
- 仅在输入边界使用(如 HTTP 请求处理)
- 避免在热路径中频繁使用
- 对大型结构体考虑手动处理关键字段
总结
Conform 是一个简单易用的数据清洗库,特别适合处理用户输入数据。通过结构体标签,你可以轻松定义各种清洗规则,保持代码整洁。对于更复杂的校验需求,可以结合其他校验库如 go-playground/validator 一起使用。