什么..?
选项模式在修改函数的行为而不更改代码的情况下非常强大。
这是一种函数编程模式,用于为函数提供可选参数。
用户要将其他参数传递给SDK中的函数时,它会相应地修改行为。
假设我们有struct名称为config
,其中包含以下配置
type Config struct{
url string
port string
timeout time.Duration
}
现在我们的工厂方法是这样的。
func NewConfig(url string,port string, timout time.Duration) *Config{
return &Config{
port:port,
url:url,
timeout:timeout,
}
}
,但我希望port
和timeout
成为可选参数。我只想让它强制性
让我们定义称为Option
type Option func(*Config)
选项是一种函数,可用于Config
。通过使用此选项将修改Config
func WithPort(port string) Option{
return func(c *Config){
c.port = port
}
}
func WithTimeout(timeout time.Duration) Option{
return func(c *Config){
c.timeout = timeout
}
}
Option
只是一个功能,它采用指针并返回更新的配置。现在,我们已将所需值设置为我们的配置。让我们更新工厂方法
func NewConfig(url string, opts ...Option) *Config{
config := &Config{
url:url
}
for _, opt := range opts{
opt(config)
}
return config
}
客户端创建基本配置
appConfig := NewConfig("http://api.google.com")
客户端使用端口创建URL
appConfig := NewConfig("http://api.google.com", WithPort("3000"))
appConfig := NewConfig("http://api.google.com", WithPort("3000"), WithTimeout(30*time.Second))