Golang的选项模式
#教程 #github #go #gonuts

什么..?

选项模式在修改函数的行为而不更改代码的情况下非常强大。
这是一种函数编程模式,用于为函数提供可选参数。

用户要将其他参数传递给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,            
    }       
}

,但我希望porttimeout成为可选参数。我只想让它强制性

让我们定义称为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))




资源: