NOTE
4.1 函数式选项模式
1. 定义 - 创建由默认值的对象,同时可以灵活地修改属性 - 我们可能需要为Option的字段指定默认值 - Option的字段成员可能会发生变更 2. Golang 2.1. 要创建的对象 2.2. 测试 3. 参考 - Go语言设计模式之函数式选项模式 \ 李文周的博客
这是历史学习笔记,可能存在过时或不完整的理解。
1. 定义
- 创建由默认值的对象,同时可以灵活地修改属性
- 我们可能需要为Option的字段指定默认值
- Option的字段成员可能会发生变更
2. Golang
2.1. 要创建的对象
package 函数式选项模式
var defaultOption = &Option{
Name: "zsk",
Age: 25,
Sex: true,
}
// 函数类型,用于修改结构体属性
type OptionFunc func(option *Option)
// 普通的结构体
type Option struct {
Name string
Age int
Sex bool
}
// 对结构体的每个属性都新建一个方法
func WithName(name string) OptionFunc {
return func(option *Option) {
option.Name = name
}
}
func WithAge(age int) OptionFunc {
return func(option *Option) {
option.Age = age
}
}
func WithSex(sex bool) OptionFunc {
return func(option *Option) {
option.Sex = sex
}
}
// 构造函数
func NewOption(opts ...OptionFunc) *Option {
opt := defaultOption
for _, o := range opts {
o(opt)
}
return opt
}
2.2. 测试
package 函数式选项模式
import (
"fmt"
"testing"
)
func TestNewOption(t *testing.T) {
opt := NewOption()
fmt.Println("默认的option:", opt)
opt2 := NewOption(WithAge(33))
fmt.Println("修改后的option:", opt2)
}
//输出
默认的option: &{zsk 25 true}
修改后的option: &{zsk 33 true}