Go 开发者都在用的 Option 模式,彻底告别丑陋构造函数
Go 开发者都在用的 Option 模式,彻底告别丑陋构造函数函数式编程思想在 Go 工程实践中的优雅落地一、痛点:你被"爆炸式参数列表"折磨过吗?先看一段熟悉的代码:// 传统构造函数方式 func NewServer(addr string, port int, timeout time.Duration, maxConn int, enableLog bool, logPath string, cacheSize int, enableMetrics bool, metricsPath string) (*Server, error) { // ... 初始化逻辑 } // 调用时 server, err := NewServer("127.0.0.1", 8080, 30*time.Second, 100, true, "/var/log/app.log", 1024, true, "/metrics")灵魂拷问:这一堆true/false到底什么意思?参数顺序记错了怎么办?想加一个可选参数?所有调用方都要改!10 个参数里只有 3 个需要自定义,其他都用默认值,传不传?这就是典型的 ** telescoping constructor(爆炸式构造函数)** 问题。二、救星:Option 模式登场2.1 什么是 Option 模式?Option 模式的核心思想:将配置参数封装成函数,通过函数式选项逐步构建对象。// Option 函数类型 type Option func(*Server) // 具体的选项函数 func WithAddr(addr string) Option { return func(s *Server) { s.addr = addr } } func WithPort(port int) Option { return func(s *Server) { s.port = port } } func WithTimeout(timeout time.Duration) Option { return func(s *Server) { s.timeout = timeout } } // 新的构造函数 func NewServer(opts ...Option) (*Server, error) { // 1. 设置默认值 server := Server{ addr: "0.0.0.0", port: 8080, timeout: 30 * time.Second, maxConn: 100, enableLog: false, cacheSize: 512, } // 2. 应用所有选项 for _, opt := range opts { opt(server) } // 3. 验证配置 if err := server.validate(); err != nil { return nil, err } return server, nil }2.2 调用体验// 使用默认配置 server, err := NewServer() // 自定义部分配置(顺序随意!) server, err := NewServer( WithPort(8080), WithAddr("127.0.0.1"), WithTimeout(60 * time.Second), WithMaxConn(200), ) // 启用日志 server, err := NewServer( WithPort(8080), WithEnableLog(true), WithLogPath("/var/log/app.log"), )对比传统方式:✅ 参数语义清晰(WithPort(8080)vs 裸值8080)✅ 可选参数无需传递✅ 新增参数不影响现有代码✅ 默认值集中管理三、实战:生产级 Option 模式实现3.1 完整示例:数据库连接池package dbpool import ( "crypto/tls" "time" ) // Config 配置结构(内部使用) type config struct { host string port int username string password string database string maxOpenConns int maxIdleConns int connMaxLifetime time.Duration connMaxIdleTime time.Duration sslMode bool tlsConfig *tls.Config driverName string } // Pool 数据库连接池 type Pool struct { config *config // ... 其他字段 } // Option 选项函数类型 type Option func(*config) // 基础配置选项 func WithHost(host string) Option { return func(c *config) { c.host = host } } func WithPort(port int) Option { return func(c *config) { c.port = port } } func WithCredentials(username, password string) Option { return func(c *config)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2435114.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!