go 的选项模式

2022-02-13  本文已影响0人  wayyyy

现在有个结构体如下定义:

type Server struct {
    host string
    port int
}

我们需要初始化结构体,如果是其他语言,函数支持默认参数:

func NewServer(host="0:0:0:0", port="8080") *Server {
    return &Server{host, port}
}

但是,go语言函数不支持默认参数,同时即使go语言支持默认参数,但是如果配置项过多,那么每一个配置项都得写一个默认参数,也不现实。
那么,在go语言中,我们怎么优雅的给其初始化呢,这时,就需要利用选项模式了(option)。

首先,我们定义一个option函数类型:

type option func(*Server)

它接收一个参数:*Server
然后定义一个NewServer函数,它接收一个 Option类型的不定参数:

func NewServer(options ...option) *Server {
    svr := &Server{}
    for _, f := range options {
        f(svr)
    }    
    return svr
}

最后,再直接定义一系列返回 Option的函数

func WithHost(host string) Option {
    return func(s *Server) {
        s.host  = host
    }
}

func WithPort(port int) Option {
    return func(s * Server) {
        s.port = port
    }
}

使用时,直接:

func main() {
    svr := NewServer(
        WithHost("localhost"),
        WithPort(8080),
    )
}

参考资料
1、https://juejin.cn/post/6844903729313873927
2、https://mp.weixin.qq.com/s/_7ofuy2Wp__3B9esO_2oag

上一篇下一篇

猜你喜欢

热点阅读