go的option模式

go的option模式

1.函数option

把option定义为函数。

go 复制代码
package main

import "fmt"

// ServerConfig 定义服务器配置
type ServerConfig struct {
	Port    int
	Timeout int
}

// Option 定义函数选项类型
type Option func(*ServerConfig)

// WithPort 设置服务器端口
// 这是一个闭包函数
func WithPort(port int) Option {
	return func(cfg *ServerConfig) {
		cfg.Port = port
	}
}

// WithTimeout 设置超时时间
func WithTimeout(timeout int) Option {
	return func(cfg *ServerConfig) {
		cfg.Timeout = timeout
	}
}

// NewServer 创建一个新的服务器实例
// options将参数一并传入
func NewServer(options ...Option) *ServerConfig {
	cfg := &ServerConfig{
		Port:    8080,
		Timeout: 30,
	}
	for _, opt := range options {
		opt(cfg)
	}
	return cfg
}

func main() {
	// 创建服务器实例并指定选项
	server := NewServer(
		WithPort(9090),
		WithTimeout(60),
	)

	fmt.Printf("Server Port: %d, Timeout: %d\n", server.Port, server.Timeout)
}

NewServer 函数用于创建一个新的 ServerConfig 实例。它接受一个或多个 Option 类型的参数,并使用这些参数来配置 ServerConfig 的实例。

option使用场景:

对象配置:当需要创建一个对象,并且这个对象有很多可配置的属性时,使用Option模式可以避免构造函数的参数列表变得冗长和难以管理。

go 复制代码
func main() {
	c := &ServerConfig{
		Port:    9090,
		Timeout: 30,
	}
    // x记住了80
	x := WithPort(80)
    // x函数传入参数c,x函数里面能访问80
	x(c)
}

闭包的好处:

  1. 封装状态和行为:闭包可以封装函数及其相关的引用环境,将数据和行为捆绑在一起,形成一个独立的单元。这使得函数不仅仅是一个独立的执行单元,还能够保持其自己的状态,从而在后续的调用中能够持续地使用或修改这些状态。

2.接口option

把option定义为接口。

go 复制代码
package main

import "fmt"

type ServerConfig struct {
	Port    int
	Timeout int
}

type ServerOption interface {
	Apply(config *ServerConfig)
}

type Port struct {
	Value int
}

func (p Port) Apply(config *ServerConfig) {
	config.Port = p.Value
}

type Timeout struct {
	Value int
}

func (t Timeout) Apply(config *ServerConfig) {
	config.Timeout = t.Value
}

func NewServerConfig(options ...ServerOption) *ServerConfig {
	s := new(ServerConfig)
	for _, opt := range options {
		opt.Apply(s)
	}
	return s
}

func main() {
	p := Port{8080}
	t := Timeout{10}
	s := NewServerConfig(p, t)
	fmt.Println(s)
}
相关推荐
Magnum Lehar9 分钟前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
Mcworld85723 分钟前
java集合
java·开发语言·windows
成功人chen某24 分钟前
配置VScodePython环境Python was not found;
开发语言·python
海绵宝宝贾克斯儿1 小时前
C++中如何实现一个单例模式?
开发语言·c++·单例模式
史迪仔01121 小时前
[python] Python单例模式:__new__与线程安全解析
开发语言·python·单例模式
isyangli_blog2 小时前
(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类
java·开发语言
三块钱07942 小时前
【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案
开发语言·python·音视频
易只轻松熊2 小时前
C++(20): 文件输入输出库 —— <fstream>
开发语言·c++·算法
芯眼2 小时前
ALIENTEK精英STM32F103开发板 实验0测试程序详解
开发语言·c++·stm32·单片机·嵌入式硬件·社交电子
Yvonne爱编码2 小时前
CSS- 4.1 浮动(Float)
前端·css·html·github·html5·hbuilder