package main
import (
"fmt"
"time"
)
// Go语言采用函数选项模式进行灵活的服务参数配置
// Config 结构体用来存储配置选项的值。
type Config struct {
verbose bool
HTTP HTTPConfig
}
// HTTPConfig 是 HTTP 相关的配置。
type HTTPConfig struct {
Port int
Timeout time.Duration
Security SecurityConfig
}
// SecurityConfig 是安全性相关的配置。
type SecurityConfig struct {
Enabled bool
Key string
}
// Option 是一个函数类型,接收一个 Config 指针并修改它的字段。
type Option func(*Config)
// WithVerbose Option 函数,用于设置 Config 的 verbose 字段。
func WithVerbose(v bool) Option {
return func(c *Config) {
c.verbose = v
}
}
// WithHTTPPort Option 函数,用于设置 HTTPConfig 的 Port 字段。
func WithHTTPPort(port int) Option {
return func(c *Config) {
c.HTTP.Port = port
}
}
// WithHTTPTimeout Option 函数,用于设置 HTTPConfig 的 Timeout 字段。
func WithHTTPTimeout(d time.Duration) Option {
return func(c *Config) {
c.HTTP.Timeout = d
}
}
// WithSecurityEnabled Option 函数,用于设置 SecurityConfig 的 Enabled 字段。
func WithSecurityEnabled(enabled bool) Option {
return func(c *Config) {
c.HTTP.Security.Enabled = enabled
}
}
// WithSecurityKey Option 函数,用于设置 SecurityConfig 的 Key 字段。
func WithSecurityKey(key string) Option {
return func(c *Config) {
c.HTTP.Security.Key = key
}
}
// Service 服务类型,包含了一个 Config 指针。
type Service struct {
config *Config
}
// NewService 工厂函数,创建并返回一个新的 Service 实例。 接受一系列 Option 函数,用于配置 Config。
func NewService(opts ...Option) *Service {
config := &Config{
verbose: false,
HTTP: HTTPConfig{
Port: 8080,
Timeout: 5 * time.Second,
Security: SecurityConfig{
Enabled: false,
Key: "",
},
},
}
// 应用配置选项
for _, opt := range opts {
opt(config)
}
// 创建并返回服务实例
return &Service{config: config}
}
// Start 启动服务
func (s *Service) Start() {
if s.config.verbose {
fmt.Println("Starting service...")
fmt.Printf("HTTP Server running on port %d with timeout %v.\n", s.config.HTTP.Port, s.config.HTTP.Timeout)
if s.config.HTTP.Security.Enabled {
fmt.Println("Security is enabled.")
}
}
}
func main() {
svc := NewService(
WithVerbose(true),
WithHTTPPort(8081),
WithHTTPTimeout(10*time.Second),
WithSecurityEnabled(true),
WithSecurityKey("secret-key"),
)
fmt.Printf("Verbose: %v, HTTP Port: %d, HTTP Timeout: %v, Security Enabled: %v, Security Key: %s\n",
svc.config.verbose, svc.config.HTTP.Port, svc.config.HTTP.Timeout, svc.config.HTTP.Security.Enabled, svc.config.HTTP.Security.Key)
svc.Start()
}