kagxin / blog

个人博客:技术、随笔、生活
https://github.com/kagxin/blog/issues
7 stars 0 forks source link

Functional Options #67

Open kagxin opened 3 years ago

kagxin commented 3 years ago

被初始化的 struct

func New(addr string, port int, timeout time.Duration, maxConns int) Server { s := &Server{ Addr: addr, Port: port, Timeout: 10 time.Second, MaxConns: 100, } if timeout != nil { s.Timeout = timeout } if maxConns != nil { s.MaxConns = maxConns } return s }

func NewWithTimeout(addr string, port int, timeout time.Duration) *Server { s := &Server{ Addr: addr, Port: port, Timeout: timeout, MaxConns: 100, } return s }

func NewWithMaxConns(addr string, port int, maxConns int) Server { s := &Server{ Addr: addr, Port: port, Timeout: 10 time.Second, MaxConns: maxConns, } return s }

func NewWithTimeoutMaxConns(addr string, port int, timeout time.Duration, maxConns int) *Server { s := &Server{ Addr: addr, Port: port, Timeout: timeout, MaxConns: maxConns, } return s }

客户端初始化代码:
```golang
server := NewWithTimeout("127.0.0.1", 8000, 5*time.Second)

使用 Builder 模式

import "time"

type ServerBuilder struct {
    Server
}

func (sb *ServerBuilder) Create(addr string, port int) *ServerBuilder {
    return &ServerBuilder{
        Server: Server{
            Addr:     addr,
            Port:     port,
            Timeout:  10 * time.Second,
            MaxConns: 100,
        },
    }
}

func (sb *ServerBuilder) WithTimeout(timeout time.Duration) *ServerBuilder {
    sb.Server.Timeout = timeout
    return sb
}

func (sb *ServerBuilder) WithMaxConns(maxConns int) *ServerBuilder {
    sb.Server.MaxConns = maxConns
    return sb
}

func (sb *ServerBuilder) Build() *Server {
    return &sb.Server
}

客户端初始化代码:

sb := ServerBuilder{}
server := sb.Create("127.0.0.1", 8000).WithTimeout(5 * time.Second).Build()

functional options


type Option func(*Server)

func TimeOut(timeout time.Duration) Option {
    return func(s *Server) {
        s.Timeout = timeout
    }
}

func MaxConns(maxCon int) Option {
    return func(s *Server) {
        s.MaxConns = maxCon
    }
}

func New(addr string, port int, options ...Option) *Server {
    server := &Server{
        Addr:     addr,
        Port:     port,
        Timeout:  10 * time.Second,
        MaxConns: 100,
    }
    for _, opt := range options {
        opt(server)
    }
    return server
}

客户端初始化代码:

server := New("127.0.0.1", 8000, TimeOut(5*time.Second))