使用场景
在go的开发过程中,有的时候我们常常会碰到这样的场景:new一个结构体的时候参数不确定,但是我们又需要根据我们的需求来进行结构体的初始化赋值,那么碰到这样场景的时候,我们除了为不同的初始化方法写多个结构体的new方法之外,还可以运用Go 语言的函数选项模式来进行初始化赋值操作。
实际案例
package main
import (
"fmt"
)
type Options struct {
Age int
Name string
}
type OptionFunc func(*Options)
func NewOptions(opts ...OptionFunc) *Options {
raw := &Options{}
for _, opt := range opts {
opt(raw)
}
return raw
}
func SetAge(age int) OptionFunc {
return func(o *Options) {
o.Age = age
}
}
func SetName(name string) OptionFunc {
return func(o *Options) {
o.Name = name
}
}
func main() {
opt := NewOptions(SetName("zhang"), SetAge(12))
fmt.Println(opt)
}
案例二
type Option func(*gorm.DB)
func UserID(ID int64) Option {
return func(db *gorm.DB) {
db.Where("`id` = ?", ID)
}
}
func Name(name int64) Option {
return func(db *gorm.DB) {
db.Where("`name` like %?%", name)
}
}
func Age(age int64) Option {
return func(db *gorm.DB) {
db.Where("`age` = ?", age)
}
}
func GetUsersByCondition(ctx context.Context, opts ...Option)([]*User, error) {
db := GetDB(ctx)
for i:=range opts {
opts[i](db)
}
var users []User
if err := db.Model(&User{}).Find(&users).Err; err != nil {
return nil, err
}
return users, nil
}