多个if
if !PortCheck(d.Port) {return common.NewParameterError(ModbusAddress{}, "Port")}if IsLessThenZero(d.UnitID) {return common.NewParameterError(ModbusAddress{}, "UnitID")}if net.ParseIP(d.IP) == nil {return common.NewParameterError(ModbusAddress{}, "IP")}
switch {case !PortCheck(d.Port):return common.NewParameterError(ModbusAddress{}, "Port")case IsLessThenZero(d.UnitID):return common.NewParameterError(ModbusAddress{}, "UnitID")case net.ParseIP(d.IP) == nil:return common.NewParameterError(ModbusAddress{}, "IP")}
配置对象
当有有一个配置对象Server,其中部分参数必填,部分参数选填。
type Server struct {Addr stringPort intProtocol stringTimeout time.DurationMaxConns intTLS *tls.Config}
func NewDefaultServer(addr string, port int) (*Server, error) {return &Server{addr, port, "tcp", 30 * time.Second, 100, nil}, nil}func NewTLSServer(addr string, port int, tls *tls.Config) (*Server, error) {return &Server{addr, port, "tcp", 30 * time.Second, 100, tls}, nil}func NewServerWithTimeout(addr string, port int, timeout time.Duration) (*Server, error) {return &Server{addr, port, "tcp", timeout, 100, nil}, nil}func NewTLSServerWithMaxConnAndTimeout(addr string, port int, maxconns int, timeout time.Duration, tls *tls.Config) (*Server, error) {return &Server{addr, port, "tcp", 30 * time.Second, maxconns, tls}, nil}
build模式
//使用一个builder类来做包装type ServerBuilder struct {Server}func (sb *ServerBuilder) Create(addr string, port int) *ServerBuilder {sb.Server.Addr = addrsb.Server.Port = port//其它代码设置其它成员的默认值return sb}func (sb *ServerBuilder) WithProtocol(protocol string) *ServerBuilder {sb.Server.Protocol = protocolreturn sb}func (sb *ServerBuilder) WithMaxConn( maxconn int) *ServerBuilder {sb.Server.MaxConns = maxconnreturn sb}func (sb *ServerBuilder) WithTimeOut( timeout time.Duration) *ServerBuilder {sb.Server.Timeout = timeoutreturn sb}func (sb *ServerBuilder) WithTLS( tls *tls.Config) *ServerBuilder {sb.Server.TLS = tlsreturn sb}func (sb *ServerBuilder) Build() (Server) {return sb.Server}
使用
sb := ServerBuilder{}server, err := sb.Create("127.0.0.1", 8080).WithProtocol("udp").WithMaxConn(1024).WithTimeOut(30*time.Second).Build()
Functional Options
type Option func(*Server)func Protocol(p string) Option {return func(s *Server) {s.Protocol = p}}func Timeout(timeout time.Duration) Option {return func(s *Server) {s.Timeout = timeout}}func MaxConns(maxconns int) Option {return func(s *Server) {s.MaxConns = maxconns}}func TLS(tls *tls.Config) Option {return func(s *Server) {s.TLS = tls}}func NewServer(addr string, port int, options ...func(*Server)) (*Server, error) {srv := Server{Addr: addr,Port: port,Protocol: "tcp",Timeout: 30 * time.Second,MaxConns: 1000,TLS: nil,}for _, option := range options {option(&srv)}//...return &srv, nil}
使用:
s1, _ := NewServer("localhost", 1024)s2, _ := NewServer("localhost", 2048, Protocol("udp"))s3, _ := NewServer("0.0.0.0", 8080, Timeout(300*time.Second), MaxConns(1000))
