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
  • asp之家 网络编程 m.aspxhome.com