GO 函数式选项模式(Functional Options Pattern)
作者:等你下课啊 时间:2024-05-22 10:16:05
Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.
在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?
有很多可能的方法可以做到这一点, 但是大多数都不能满足要求, 或者需要在服务端的代码中进行额外的检查和验证, 或者通过传递额外的客户端不关心的参数来为客户端做额外的工作.
下面介绍GO 函数式选项模式(Functional Options Pattern),内容如下:
Option模式的优缺点
优点:
1. 支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性
2. 任意顺序传递参数
3. 支持默认值
4. 方便拓展
缺点:
1. 增加许多function,成本增大
2. 参数不太复杂时,尽量少用
DEMO
package main
import "fmt"
type Client struct {
Id int64
AppKey string
AppSecret string
}
type Option func(*Client) // go函数的参数都是值传递 因此想要修改Client(默认值) 必须传递指针
func WithAppKey(appKey string) Option {
return func(client *Client) {
client.AppKey = appKey
}
}
func WithAppSecret(appSecret string) Option {
return func(client *Client) {
client.AppSecret = appSecret
}
}
//
// NewClient
// @Description 将一个函数的参数设置为可选的功能
// @param id 固定参数,也可以将所有都放进可选参数 opts 中
// @param opts
// @return Client 返回 *Client 和 Client 都可以
//
func NewClient(id int64, opts ...Option) Client {
o := Client{
Id: id,
AppKey: "key_123456",
AppSecret: "secret_123456",
}
for _, opt := range opts {
opt(&o) // go函数的参数都是值传递 因此想要修改Client(默认值) 必须传递指针
}
return o
}
func main() {
// 使用默认值
fmt.Println(NewClient(1)) // {1 key_123456 secret_123456}
// 使用传入的值
fmt.Println(NewClient(2, WithAppKey("change_key_222"))) // {2 change_key_222 secret_123456}
// 不按照顺序传入
fmt.Println(NewClient(3, WithAppSecret("change_secret_333"))) // {3 key_123456 change_secret_333}
fmt.Println(NewClient(4, WithAppSecret("change_secret_444"), WithAppKey("change_key_444"))) // {4 change_key_444 change_secret_444}
}
来源:https://www.cnblogs.com/dibtp/p/15414148.html
标签:GO,函数式选项模式,Option模式
0
投稿
猜你喜欢
python3安装OCR识别库tesserocr过程图解
2021-12-08 04:50:08
JavaScript使用indexOf()实现数组去重的方法分析
2024-04-28 09:39:03
python 多线程爬取壁纸网站的示例
2023-11-14 21:45:30
python实现npy格式文件转换为txt文件操作
2021-04-03 08:07:05
switchery按钮的使用方法
2024-04-29 13:40:44
Python基于SMTP协议实现发送邮件功能详解
2022-07-17 00:31:00
25个值得收藏的Python文本处理案例
2022-06-19 15:38:29
JavaScript基础知识学习笔记
2024-05-13 10:35:15
oracle数据库冷备份的方法
2023-07-19 09:51:19
python去除空格,tab制表符和\\n换行符的小技巧分享
2022-05-12 14:20:39
python并发编程多进程之守护进程原理解析
2023-09-13 14:07:42
未能找到存储过程’master.dbo.xp_fileexist’解决方法
2011-03-13 09:29:00
php 常用算法和时间复杂度
2023-11-05 10:30:49
Python 实现敏感目录扫描的示例代码
2021-08-21 05:47:14
Django的CVB实例详解
2023-11-04 06:47:26
javascript中typeof操作符和constucor属性检测
2024-05-09 10:37:27
python爬虫 urllib模块发起post请求过程解析
2022-02-07 22:52:53
ADO.NET数据库访问技术
2024-01-13 03:17:27
运维角度浅谈MySQL数据库优化(李振良)
2024-01-22 17:27:01
Python MySQL数据库连接池组件pymysqlpool详解
2024-01-22 23:59:17