Go选项模式
场景
模拟服务器配置初始化
模式优点
避免形参过长
套路
- 先初始化写死的配置
- options一个个调用
- 确保一次没有的参数进行默认赋值
代码
package main
import "fmt"
const (
_defaultTime = 3
)
type options func(server *Server)
type Server struct {
Addr string
overTime int
}
func NewServer(addr string, opts ...options) *Server {
var s Server
s.Addr = addr
for _, opt := range opts {
opt(&s)
}
ensure(&s)
return &s
}
func WithTime(t int) options {
return func(server *Server) {
server.overTime = t
}
}
func ensure(s *Server) {
if s.overTime == 0 {
s.overTime = _defaultTime
}
}
func main() {
s1 := NewServer("0.0.0.0:3000")
fmt.Println(s1)
s2 := NewServer("0.0.0.0:3000", WithTime(6))
fmt.Println(s2)
}
拓展性
类似于
func WithTime(t int) options {
return func(server *Server) {
server.overTime = t
}
}
可以无限拓展,但是保证结构体里面有属性