Go选项模式

场景

模拟服务器配置初始化

模式优点

避免形参过长

套路

  1. 先初始化写死的配置
  2. options一个个调用
  3. 确保一次没有的参数进行默认赋值

代码

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
	}
}

可以无限拓展,但是保证结构体里面有属性

posted @ 2021-04-07 16:41  maob  阅读(139)  评论(0编辑  收藏  举报