Golang 实现默认参数

本贴最后更新于 2060 天前,其中的信息可能已经事过境迁

在 golang 中是不支持默认参数的,micro 中有一种优雅的实现方法(并非 micro 首创),叫做 Functional Options Patter。Functional Options 可以用来实现简洁的支持默认参数的函数方法。

options

package server import ( "time" ) type Options struct { ConnectTimeOut time.Duration Name string Address string } type Option func(*Options) func newOptions(opt ...Option) Options { opts := Options{} for _, o := range opt { o(&opts) } if len(opts.Address) == 0 { opts.Address = DefaultAddress } if len(opts.Name) == 0 { opts.Name = DefaultName } if opts.ConnectTimeOut == time.Duration(0) { opts.ConnectTimeOut = DefaultConnectTimeOut } return opts } // Name server name func Name(n string) Option { return func(o *Options) { o.Name = n } } // Address server address func Address(a string) Option { return func(o *Options) { o.Address = a } } // ConnectTimeOut 连接超时时间 func ConnectTimeOut(t time.Duration) Option { return func(o *Options) { o.ConnectTimeOut = t } }

server

package server import "sync" var ( DefaultAddress = ":0" DefaultName = "server" DefaultConnectTimeOut = time.Second * 4 ) type Server struct { sync.RWMutex opts Options } func NewServer(opts ...Option) Server { options := newOptions(opts...) return &Server{ opts: options, } } func (s *Server) Options() Options { s.RLock() opts := s.opts s.RUnlock() return opts } func (s *Server) Init(opts ...Option) error { s.Lock() for _, opt := range opts { opt(&s.opts) } s.Unlock() return nil } func (s *Server) Start() error { return nil } func (s *Server) Stop() error { return nil }

使用

server := NewServer( Name("test Name"), Address("test Address"), )
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 249 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...