Golang Option 模式看這一篇就夠了

在 Go 語言中,我們經常需要定義結構體,並通過構造函數初始化它們。然而,Go 不支持默認參數,如果一個結構體有很多可選參數,我們會面臨以下問題:

爲了解決這個問題,Golang 社區廣泛採用 Option 模式,讓我們可以優雅地管理可選參數。本文將詳細講解 Option 模式的 原理、實現方式、對比分析最佳實踐

什麼是 Option 模式?

Option 模式是一種 構造函數參數管理方式,它利用 函數式編程 或 結構體配置 來提供靈活的參數設置方式。

在 Go 語言中,Option 模式主要有 兩種實現方式

接下來,我們分別介紹這兩種實現方式。

Functional Options(函數選項模式) 

✅ 推薦方式

核心思想

Functional Options 通過 定義一組 Option 函數,每個函數都修改一個配置項。最終,構造函數 NewXXX 接收這些 Option 並應用。

示例

package main
import "fmt"
// Server 結構體
type Server struct {
    Host string
    Port int
    TLS  bool
}
// Option 函數類型
type Option func(*Server)
// WithHost 設置 Host
func WithHost(host string) Option {
    return func(s *Server) {
        s.Host = host
    }
}
// WithPort 設置端口
func WithPort(port int) Option {
    return func(s *Server) {
        s.Port = port
    }
}
// WithTLS 啓用 TLS
func WithTLS() Option {
    return func(s *Server) {
        s.TLS = true
    }
}
// NewServer 構造函數
func NewServer(opts ...Option) *Server {
    s := &Server{
        Host: "localhost", // 默認值
        Port: 8080,        // 默認端口
        TLS:  false,       // 默認不啓用 TLS
    }
    for _, opt := range opts {
        opt(s)
    }
    return s
}
func main() {
    server := NewServer(WithHost("example.com"), WithTLS())
    fmt.Printf("Server Config: %+v\n", server)
}

優點

✅ 可讀性高,調用 NewServer 時,參數一目瞭然。 

✅ 靈活擴展,可以隨時添加新 Option,不影響現有代碼。

 ✅ 避免默認值問題,未指定的參數保持默認值。

Struct Options(結構體選項模式)

核心思想

通過定義一個 Config 結構體,用戶可填充所需字段,然後傳入 NewXXX 構造函數。

示例

package main
import "fmt"
// ServerConfig 結構體
type ServerConfig struct {
    Host string
    Port int
    TLS  bool
}
// Server 結構體
type Server struct {
    config ServerConfig
}
// NewServer 構造函數
func NewServer(config ServerConfig) *Server {
    if config.Host == "" {
        config.Host = "localhost"
    }
    if config.Port == 0 {
        config.Port = 8080
    }
    return &Server{config: config}
}
func main() {
    config := ServerConfig{
        Host: "example.com",
        TLS:  true,
    }
    server := NewServer(config)
    fmt.Printf("Server Config: %+v\n", server.config)
}

優點

✅ 直觀,所有參數集中在 Config 結構體中。 

✅ 適合配置文件(如 JSON/YAML)。 

❌ 可擴展性較差,添加新選項時,所有調用 NewServer 的代碼都需要更新。

Option 模式對比與選擇

Cl1TfJ

✅ 推薦:Functional Options(函數選項模式),特別適用於 選項較多、未來可能擴展 的場景。

最佳實踐

  1. 默認值處理
  1. 錯誤處理
  1. 鏈式調用(可選)

總結

在實際開發中,如果你希望代碼更具擴展性,推薦 Functional Options,如果你的配置項較固定,推薦 Struct Options。希望這篇文章能幫助你更好地理解 Golang Option 模式!🚀,

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Rx1RJKKBfmxSZ83ebspFWA