这篇文章主要为大家详细介绍了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语言中的Option设计模式
基础教程推荐
猜你喜欢
- R语言绘制折线图实例分析 2022-11-21
- R语言 ggplot2改变柱状图的顺序操作 2022-11-17
- 浅析ELF转二进制允许把 Binary 文件加载到任意位置 2023-07-06
- Ruby3多线程并行Ractor使用方法详解 2023-07-23
- Swift初始化器与可选链的使用方法介绍 2023-07-08
- ruby-on-rails-为使用Rails 4,nginx和乘客的用户设置自定义域 2023-09-21
- ruby on rails validates 2023-09-22
- Swift中重写和重载的使用与对比总结 2023-07-05
- win10下使用virtualbox + vagrant配置ruby开发机环境 2023-07-23
- R语言-修改(替换)因子变量的元素操作 2022-11-26
