• Go的函数选项模式


    使用场景

    在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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    案例二

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    广告推荐CTR点击率预测实践项目!
    探究SpringWeb对于请求的处理过程
    Java反射
    PWC光流估计网络
    DRF 学习
    Ultra-Light-Fast-Generic-Face-Detector-1MB-master人脸检测算法的复现过程记录
    SystemVerilog验证——数据类型
    VMware/kali使用小贴士(持续更新(吧
    类与对象 (下)
    layui 富文本编辑器layedit 以及 图片转base64前端页面显示
  • 原文地址:https://blog.csdn.net/weixin_47978762/article/details/133894522