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}
}

工作原理

  1. 首先定义一个结构体,在需要自动填充的字段上添加fill标签
  2. 标签格式为fill:"填充器名称:源字段名"
  3. 使用filler.RegFiller注册填充器函数
  4. 调用filler.Fill方法自动填充结构体

在这个示例中,UserName字段会根据UserID字段的值自动填充,填充逻辑由注册的UserNameFiller函数实现。

注意事项

  1. 填充器需要在init函数中注册
  2. 填充器函数接收源字段值作为参数,返回填充后的值
  3. 填充器函数需要处理类型转换和错误情况

这个工具非常适合在需要根据已有字段自动生成其他字段值的场景下使用。


更多关于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
	}
}

最佳实践

  1. 配置处理:非常适合处理应用程序配置
  2. API 请求处理:可以方便地绑定请求参数到结构体
  3. 测试数据生成:快速生成测试用的结构体数据

注意事项

  1. 确保传入的是结构体指针
  2. 字段必须是导出的(首字母大写)
  3. 复杂类型可能需要自定义填充函数

Filler 通过简单的标签语法提供了强大的自动填充功能,可以显著减少样板代码,提高开发效率。

回到顶部