关于什么是规划形式,笔者在这里就不做过多的解说。咱们自行百度谷歌就好。下面咱们聊聊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形式,在许多场景中都能用到,而且也对错常好用的。咱们记住它是在初始化数据的时分用就行,代码形式相对固定。