golang设计模式-函数选项模式

news/2025/2/24 13:32:29

函数选项模式

什么是函数选项模式

在 Go 语言中,函数选项模式是一种优雅的设计模式,用于处理函数的可选参数。它提供了一种灵活的方式,允许用户在函数调用时传递一组可选参数,而不是依赖于固定数量和顺序的参数列表。

哪些地方应用

gRPC,Kubernetes,Kratos,Beego

函数选项模式的实现

函数选项模式的实现一般包含以下几个部分:

  • 选项结构体:用于存储函数的配置参数
  • 选项函数类型:接收选项结构体参数的函数
  • 定义功能函数:接收 0 个或多个固定参数和可变的选项函数参数
  • 设置选项的函数:定义多个设置选项的函数,用于设置选项

示例:

原代码

package main

import (
	"fmt"
	"time"
)

type Server struct {
	Addr         string
	Port         string
	ReadTimeout  time.Duration
	WriteTimeout time.Duration
	Timeout      time.Duration
}

func NewServer(addr string, port string, readTimeout time.Duration, writeTimeout time.Duration, timeout time.Duration) Server {
	return Server{
		Addr:         addr,
		Port:         port,
		ReadTimeout:  readTimeout,
		WriteTimeout: writeTimeout,
		Timeout:      timeout,
	}
}

func main() {
	server := NewServer("localhost", ":8080", 2*time.Second, 2*time.Second, 4*time.Second)
	fmt.Println(server)
}

缺点:

  1. 结构体属性多,参数列表太长,调用者负担大,容易写错
  2. 没有默认值,默认是零值

函数选项模式:

package main

import (
	"fmt"
	"time"
)

type Server struct {
	Addr         string
	Port         string
	ReadTimeout  time.Duration
	WriteTimeout time.Duration
	Timeout      time.Duration
}

type Option func(*Server)

func WithAddr(addr string) Option {
	return func(s *Server) {
		s.Addr = addr
	}
}
func WithPort(port string) Option {
	return func(s *Server) {
		s.Port = port
	}
}
func WithReadTimeout(readTimeout time.Duration) Option {
	return func(s *Server) {
		s.ReadTimeout = readTimeout
	}
}
func WithWriteTimeout(writeTimeout time.Duration) Option {
	return func(s *Server) {
		s.WriteTimeout = writeTimeout
	}
}
func WithTimeout(timeout time.Duration) Option {
	return func(s *Server) {
		s.Timeout = timeout
	}
}
func NewServer(options ...Option) *Server {
	srv := &Server{
		Addr:         "localhost",
		Port:         ":8080",
		ReadTimeout:  2 * time.Second,
		WriteTimeout: 2 * time.Second,
		Timeout:      4 * time.Second,
	}
	for _, option := range options {
		option(srv)
	}
	return srv
}

func main() {
	server := NewServer(WithPort(":9000"))
	fmt.Println(server)
}
函数选项模式的好处
  • 易于使用:调用者可以选择性的设置函数参数,而不需要记住参数的顺序和类型;
  • 可读性强:函数选项模式的代码有着自文档化的特点,调用者能够直观地理解代码的功能;
  • 扩展性好:通过添加新的 Option 参数选项,函数可以方便地扩展功能,无需修改函数的签名;
  • 函数选项模式可以提供默认参数值,以减少参数传递的复杂性。
函数选项模式的缺点

前面提到了函数选项模式的优势(好处),但也必须承认它存在一些缺点。

  • 复杂性:函数选项模式引入了更多的类型和概念,需要更多的代码和逻辑来处理。这增加了代码的复杂性和理解的难度,尤其是对于初学者来说。
  • 可能存在错误的选项组合:由于函数选项模式允许在函数调用中指定多个选项,某些选项之间可能存在冲突或不兼容的情况。这可能导致意外的行为或错误的结果。
  • 不适用于所有情况:函数选项模式适用于有大量可选参数或者可配置选项的函数,但对于只有几个简单参数的函数,使用该模式可能过于复杂和冗余。在这种情况下,简单的命名参数可能更直观和易于使用。
推荐阅读

Go语言设计模式之函数选项模式 | 李文周的博客


http://www.niftyadmin.cn/n/5864387.html

相关文章

冒泡排序(详解)c++

冒泡排序(Bubble Sort)也是⼀种简单的排序算法。它的⼯作原理是每次检查相邻两个元素,如果前⾯ 的元素与后⾯的元素满⾜给定的排序条件,就将相邻两个元素交换。当没有相邻的元素需要交换时, 排序就完成了。 由于在算法的执⾏过程中&#xff0…

H5 火柴人科目三和GitHub获取仓库点星星的用户列表发生了艺术的碰撞

先看效果,代码写的比较乱,有待优化 效果 https://linyisonger.github.io/H5.Examples/?name./089.%E7%9C%8B%E6%98%9F%E6%98%9F%E7%9A%84%E8%88%9E%E8%80%85.html 思路 看起来很简单,实则也不是很难,就是需要思路要打开。 一…

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类,只要是他的子类,或子类的子类,都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法(Chaotic Evolution Optimization, CEO)是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的,甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全, 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件,能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…

蓝桥杯 Java B 组之背包问题(01背包、完全背包)

Day 1:背包问题(01背包、完全背包) 📖 一、背包问题简介 背包问题是动态规划(DP)中一个经典的优化问题,涉及物品选择和容量约束。通常分为以下几类: 01 背包(0/1 Knaps…

49 set与map的模拟实现

目录 一、源码及框架分析 二、模拟实现map和set (一)复用红黑树的框架,并支持insert (二)支持迭代器的实现 (三)map支持 [ ] (四)整体代码实现 一、源码及框架分析…

【Go】Go wire 依赖注入

1. wire 简介 wire 是一个 Golang 的依赖注入框架(类比 Spring 框架提供的依赖注入功能) ⭐ 官方文档:https://github.com/google/wire 这里关乎到编程世界当中一条好用的设计原则:A用到了B,那么B一定是通过依赖注入的…