Golang 的选项模式

Golang 的选项模式

我们在看一些 go 的源码时,经常会看到这样一段代码:

type Option func(s *Server) error

这看上去像是一种函数类型的声明,定义了一个函数类型 Option,接收一个 Server 类型的指针作为参数,返回一个 error。

这样的声明通常用于实现选项模式,在这种模式下,我们可以在函数调用的时候传递一组可选的参数,以便于对函数或方法的行为进行自定义配置。

我们举个例子,定义一个 Server 类,在构建 Server 的时候可以传入自定义的配置:

type Server struct {
    Host string
    Port int
}

type Option func(s *Server) error

func NewServer(options ...Option) (*Server, error) {
    server := &Server{}

    for _, option := range options {
        if err := option(server); err!= nil {
            return nil, err
        }
    }
    return server, nil
}

// 定义 Host 选项
func WithHost(host string) Option {
    return func(s *Server) error {
        s.Host = host
        return nil
    }
}

// 定义 Port 选项
func WithPort(port int) Option {
    return func(s *Server) error {
        s.Port = port
        return nil
    }
}

func main() {
    // 构建 server 时我们可以传入任意的配置选项
    server, err := NewServer(
        WithHost("localhost"), 
        WithPort(8080))
    if err!= nil {
        fmt.Println(err)
    }
    fmt.Println(server)
}

很明显,用了选项模式后,我们在扩展 Server 的功能时可以更加灵活,并且代码的可读性也更强

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容