1.golang 学习过程中发现,golang不支持默认参数,在学习grpc 过程中,发现grpc有很优雅的实现
2.应用场景:如果你定义的结构有些扩展参数,不需要调用者传入,或只需要特定的使用者传入时
一般我们实现方式是
type Server struct {
Name string
Url string
Timeout int //扩展参数
}
func NewServer(name, url string, timeout int) *Server {
if timeout == 0 {
timeout = 10
}
return &Server{
Name: name,
Url: url,
Timeout: timeout,
}
}
type Server struct {
Name string
Url string
Timeout int //扩展参数
}
type ServerOptionInf interface {
initServer(*Server)
}
func NewServer(name, url string, o ...ServerOptionInf) *Server {
s := Server{
Name: name,
Url: url,
Timeout: 10,
}
for _, v := range o {
v.initServer(&s)
}
return &s
}
type OptionFunc func(*Server)
type ServerOption struct {
f OptionFunc
}
func (so *ServerOption)initServer(s *Server) {
so.f(s)
}
func WithTimeoutOption(timeout int) ServerOptionInf {
return &ServerOption{f: func(server *Server) {
server.Timeout = timeout
}}
}
type Server struct {
Name string
Url string
Timeout int //扩展参数
}
type OptionFunc func(*Server)
func NewServer(name, url string, op ...OptionFunc) *Server {
s := Server{
Name: name,
Url: url,
Timeout: 10,
}
for _, v := range op {
v(&s)
}
return &s
}
func WithTimeoutOption(timeout int) OptionFunc {
return func(server *Server) {
server.Timeout = timeout
}
}
也有人这样实现
有点:实现优雅,解耦
缺点:相对复杂
看下go-grpc 中的实现方式