funOption主要用在比較複雜的結構體例項化函式。
package programMod
/*
函式式選項模式
例項化serve透過傳入不同的函式來配置不同的引數
*/
import (
"crypto/tls"
"time"
)
type Server struct {
Addr string //必填
Port int //必填
Protocol string //選填
Timeout time.Duration //選填
MaxConns int //選填
TLS *tls.Config //選填
}
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))
本作品採用《CC 協議》,轉載必須註明作者和本文連結