一文详解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设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解Go语言中的有限状态机FSM

    一文详解Go语言中的有限状态机FSM

    有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述系统在不同状态下的行为和转移条件。本文主要来和大家简单讲讲Go语言中的有限状态机FSM的使用,需要的可以参考一下
    2023-04-04
  • Go 计时器使用示例全面讲解

    Go 计时器使用示例全面讲解

    这篇文章主要为大家介绍了Go 计时器使用示例全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 使用go net实现简单的redis通信协议

    使用go net实现简单的redis通信协议

    本文主要介绍了go net实现简单的redis通信协议,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • GO 语言运行环境的基础知识

    GO 语言运行环境的基础知识

    这篇文章主要介绍了GO 语言运行环境的基础知识的相关资料,需要的朋友可以参考下
    2022-09-09
  • Go语言配置解析库viper的使用指南

    Go语言配置解析库viper的使用指南

    viper 配置管理解析库,是由大神 Steve Francia 开发,本文就来和大家详细讲讲它的具体使用,文中的示例代码讲解详细,需要的可以收藏一下
    2023-06-06
  • go语言规范RESTful API业务错误处理

    go语言规范RESTful API业务错误处理

    这篇文章主要为大家介绍了go语言规范RESTful API业务错误处理方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Go简单实现协程方法

    Go简单实现协程方法

    本文主要介绍了Go简单实现协程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • Swaggo零基础入门教程

    Swaggo零基础入门教程

    swagger是一套基于OpenAPI规范构建的开源工具,使用RestApi。swagger-ui呈现出来的是一份可交互式的API文档,可以直接在文档页面尝试API的调用
    2023-01-01
  • Go设计模式之生成器模式详细讲解

    Go设计模式之生成器模式详细讲解

    生成器模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的主要功能是构建复杂的产品,而且是细化地、分步骤地构建产品,也就是说生成器模式重在一步一步解决构建复杂对象的问题
    2023-01-01
  • 基于context.Context的Golang loader缓存请求放大问题解决

    基于context.Context的Golang loader缓存请求放大问题解决

    这篇文章主要为大家介绍了基于context.Context的Golang loader缓存请求放大解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论