一文详解Go语言中的Option设计模式

 更新时间:2023年05月07日 10:29:02   作者:今天捡到一百块钱  
这篇文章主要为大家详细介绍了Go语言中Option设计模式的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下

关于什么是设计模式,笔者在这里就不做过多的解释。大家自行百度谷歌就好。下面我们聊聊Option设计模式,这个单词翻译过来就是选项的意思。

它一般都是用在初始化数据的时候使用。

type User struct {
    // 必须初始化的值
    Username string
    Age int
    
    // 非必要初始化的值
    Password string
}

结构体中,有些字段是必须要初始化的,而有些则是不用。那些不用初始化的字段就被称为可选项。用户根据自己的实际需求对其进行初始化。

一般来说,对于这种结构体,不论是必须初始化的字段还是非必须的,都是私有的字段,不会暴露给外界。

下面是一个标准的Option的设计模式

// 定义一个Option函数签名
type UserOption func(user *User)

// 提供一个可选函数
func WithUserPassword(password string) UserOption {
    return func(user *User) {
        user.Password = password
    }
}

type User struct {
    // 必须初始化的值
    Username string
    Age int
    
    // 非必要初始化的值
    Password string
}

// 定义一个初始化User的方法
func NewUser(username string, age int, opts...UserOption) *User {
    user := &User{
        Username: username,
        Age: age,
    }
    for _, opt := range opts {
        opt(user)
    }
    return user
}

步骤

  • 定义一个结构体,内部字段全部都是私有的,并且存在必须初始化字段和非必要初始化字段
  • 定义一个Option函数签名,参数是结构体指针,必须是结构体指针,因为只有指针才能设置上值
  • 定义一个初始化结构体的方法,参数是结构体必须要初始化的字段值,外加一个Option函数切片,返回值可以是结构体,也可以是指针结构体
  • 初始化结构体方法内部先初始化好一个最基本的结构体,然后遍历Option函数切片
  • 定义的Option函数实现最好用With开头,规范,不遵守也可以

Option模式变种

// 定义一个Option函数签名
type UserOptionErr func(user *User) error

// 提供一个可选函数
func WithUserPassword(password string) UserOption {
    return func(user *User) error {
        if password == "" {
            return errors.New("password 不能为空")
        }
        user.Password = password
        return nil
    }
}

type User struct {
    // 必须初始化的值
    Username string
    Age int
    
    // 非必要初始化的值
    Password string
}

// 定义一个初始化User的方法
func NewUser(username string, age int, opts...UserOption) (*User, error) {
    user := &User{
        Username: username,
        Age: age,
    }
    for _, opt := range opts {
        if err := opt(user); err != nil {
            return nil, err
        }
    }
    return user, nil
}

大家应该发现了,就是修改Option函数签名的返回值,这种模式可以用作对Option函数的参数进行校验。由于这里发生了变更,导致初始化结构体的方法也需要做出相应的变化。

对于Option模式,在很多场景中都能用到,并且也是非常好用的。大家记住它是在初始化数据的时候用就行,代码模式相对固定。

到此这篇关于一文详解Go语言中的Option设计模式的文章就介绍到这了,更多相关Go Option设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang爬虫框架 colly的使用

    Golang爬虫框架 colly的使用

    本文主要介绍了Golang爬虫框架 colly的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go语言MessageBox用法实例

    Go语言MessageBox用法实例

    这篇文章主要介绍了Go语言MessageBox用法,实例分析了MessageBox提示框的实现与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go语言指针访问结构体的方法

    Go语言指针访问结构体的方法

    这篇文章主要介绍了Go语言指针访问结构体的方法,涉及Go语言指针及结构体的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang实现常见的限流算法的示例代码

    Golang实现常见的限流算法的示例代码

    限流是项目中经常需要使用到的一种工具,一般用于限制用户的请求的频率,也可以避免瞬间流量过大导致系统崩溃,或者稳定消息处理速率,本文主要介绍了使用Go实现常见的限流算法,希望对大家有所帮助
    2023-04-04
  • golang进程内存控制避免docker内oom

    golang进程内存控制避免docker内oom

    这篇文章主要为大家介绍了golang进程内存控制避免docker内oom示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 详解如何使用Golang扩展Envoy

    详解如何使用Golang扩展Envoy

    这篇文章主要为大家介绍了详解如何使用Golang扩展Envoy实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Go 结构体、数组、字典和 json 字符串的相互转换方法

    Go 结构体、数组、字典和 json 字符串的相互转换方法

    今天小编就为大家分享一篇Go 结构体、数组、字典和 json 字符串的相互转换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 详解Golang中channel的实现

    详解Golang中channel的实现

    channel俗称管道,用于数据传递或数据共享,其本质是一个先进先出的队列,使用goroutine+channel进行数据通讯简单高效,同时也线程安全,本文就给大家讲讲Golang中channel的实现,需要的朋友可以参考下
    2023-09-09
  • Go语言学习教程之声明语法(译)

    Go语言学习教程之声明语法(译)

    Golang 就是类C的语法,下面这篇文章主要给大家介绍了关于Go语言学习教程之声明语法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • Go语言中的init函数特点及用法详解

    Go语言中的init函数特点及用法详解

    在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备,在这篇文章中,我们将详细探讨init()函数的特点、用途和注意事项
    2023-06-06

最新评论