网站规划建设与推广,昆山住房和城乡建设部网站,湛江专业做网站,磁力链使用场景
在go的开发过程中#xff0c;有的时候我们常常会碰到这样的场景#xff1a;new一个结构体的时候参数不确定#xff0c;但是我们又需要根据我们的需求来进行结构体的初始化赋值#xff0c;那么碰到这样场景的时候#xff0c;我们除了为不同的初始化方法写多个结构…使用场景
在go的开发过程中有的时候我们常常会碰到这样的场景new一个结构体的时候参数不确定但是我们又需要根据我们的需求来进行结构体的初始化赋值那么碰到这样场景的时候我们除了为不同的初始化方法写多个结构体的new方法之外还可以运用Go 语言的函数选项模式来进行初始化赋值操作。
实际案例
package mainimport (fmt
)type Options struct {Age intName 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 []Userif err : db.Model(User{}).Find(users).Err; err ! nil {return nil, err}return users, nil
}