golang通过fill标签自动填充结构体的实用插件filler的使用
golang通过fill标签自动填充结构体的实用插件filler的使用
filler是一个小型工具,用于填充结构体中的空白字段。
安装
$ go get github.com/yaronsumel/filler
使用示例
下面是一个完整的示例,展示如何使用filler插件通过fill标签自动填充结构体:
package main
import (
"fmt"
"github.com/yaronsumel/filler"
)
// 定义模型结构体
type model struct {
UserID string
// 使用fill标签指定填充器和源字段
UserName string `fill:"UserNameFiller:UserID"`
}
// 初始化时注册填充器
func init() {
// 注册名为"UserNameFiller"的填充器
filler.RegFiller("UserNameFiller", func(value interface{}) (interface{}, error) {
// 将UserID转换为字符串并添加前缀
return "UserId" + value.(string), nil
})
}
func main() {
// 创建模型实例,只设置UserID
m := &model{
UserID: "123",
}
// 打印填充前的结构体
fmt.Printf("%+v\n", m)
// 输出: &{UserId:123 UserName:}
// 调用填充函数
filler.Fill(m)
// 打印填充后的结构体
fmt.Printf("%+v\n", m)
// 输出: &{UserId:123 UserName:UserId123}
}
工作原理
- 首先定义一个结构体,在需要自动填充的字段上添加
fill
标签 - 标签格式为
fill:"填充器名称:源字段名"
- 使用
filler.RegFiller
注册填充器函数 - 调用
filler.Fill
方法自动填充结构体
在这个示例中,UserName
字段会根据UserID
字段的值自动填充,填充逻辑由注册的UserNameFiller
函数实现。
注意事项
- 填充器需要在init函数中注册
- 填充器函数接收源字段值作为参数,返回填充后的值
- 填充器函数需要处理类型转换和错误情况
这个工具非常适合在需要根据已有字段自动生成其他字段值的场景下使用。
更多关于golang通过fill标签自动填充结构体的实用插件filler的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang通过fill标签自动填充结构体的实用插件filler的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 结构体自动填充插件 Filler 使用指南
Filler 是一个实用的 Golang 库,通过 fill
标签可以自动填充结构体字段值,特别适合处理配置加载、表单绑定等场景。
安装
go get github.com/antonmedv/filler
基本用法
1. 简单结构体填充
package main
import (
"fmt"
"github.com/antonmedv/filler"
)
type Config struct {
Host string `fill:"default=localhost"`
Port int `fill:"default=8080"`
LogLevel string `fill:"default=info"`
}
func main() {
var cfg Config
err := filler.Fill(&cfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
// 输出: {Host:localhost Port:8080 LogLevel:info}
}
2. 从环境变量填充
type DBConfig struct {
Host string `fill:"env=DB_HOST,default=localhost"`
Port int `fill:"env=DB_PORT,default=5432"`
Username string `fill:"env=DB_USER"`
Password string `fill:"env=DB_PASS"`
}
func main() {
// 假设设置了环境变量:
// DB_USER=admin
// DB_PASS=secret
var dbCfg DBConfig
err := filler.Fill(&dbCfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", dbCfg)
// 输出: {Host:localhost Port:5432 Username:admin Password:secret}
}
3. 从 map 数据填充
type User struct {
ID int `fill:"key=user_id"`
Name string `fill:"key=username"`
Email string
Age int `fill:"default=18"`
}
func main() {
data := map[string]interface{}{
"user_id": 123,
"username": "john_doe",
"Email": "john@example.com",
}
var user User
err := filler.Fill(&user, filler.WithData(data))
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", user)
// 输出: {ID:123 Name:john_doe Email:john@example.com Age:18}
}
高级特性
1. 嵌套结构体填充
type ServerConfig struct {
Host string `fill:"default=0.0.0.0"`
Port int `fill:"default=8080"`
}
type AppConfig struct {
Server ServerConfig
Timeout int `fill:"default=30"`
}
func main() {
var cfg AppConfig
err := filler.Fill(&cfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
// 输出: {Server:{Host:0.0.0.0 Port:8080} Timeout:30}
}
2. 自定义填充函数
type Product struct {
ID string `fill:"func=uuid"`
Name string
Price float64
InStock bool `fill:"default=true"`
}
func main() {
// 注册自定义填充函数
filler.RegisterFunc("uuid", func() interface{} {
return "generated-uuid-12345"
})
var p Product
err := filler.Fill(&p)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", p)
// 输出: {ID:generated-uuid-12345 Name: Price:0 InStock:true}
}
3. 必填字段验证
type Order struct {
OrderID string `fill:"required"`
ProductID string `fill:"required"`
Quantity int `fill:"default=1"`
}
func main() {
var order Order
err := filler.Fill(&order)
if err != nil {
fmt.Println(err) // 输出错误: field OrderID is required
}
}
最佳实践
- 配置处理:非常适合处理应用程序配置
- API 请求处理:可以方便地绑定请求参数到结构体
- 测试数据生成:快速生成测试用的结构体数据
注意事项
- 确保传入的是结构体指针
- 字段必须是导出的(首字母大写)
- 复杂类型可能需要自定义填充函数
Filler 通过简单的标签语法提供了强大的自动填充功能,可以显著减少样板代码,提高开发效率。