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
的功能时可以更加灵活,并且代码的可读性也更强