NOTE

4.1 函数式选项模式

1. 定义 - 创建由默认值的对象,同时可以灵活地修改属性 - 我们可能需要为Option的字段指定默认值 - Option的字段成员可能会发生变更 2. Golang 2.1. 要创建的对象 2.2. 测试 3. 参考 - Go语言设计模式之函数式选项模式 \ 李文周的博客

Software Architecture & Engineering创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

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}

3. 参考