GO 函数式选项模式(Functional Options Pattern)

 更新时间:2021年10月16日 14:48:12   作者:等你下课啊  
Option模式支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性,任意顺序传递参数,下面给大家介绍GO 函数式选项模式(Functional Options Pattern)的相关知识,感兴趣的朋友一起看看吧

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}
}

到此这篇关于GO 函数式选项模式(Functional Options Pattern)的文章就介绍到这了,更多相关GO 函数式选项模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang unsafe包中的类型和函数详解

    Golang unsafe包中的类型和函数详解

    Golang中的unsafe包用于在运行时进行低级别的操作,这些操作通常是不安全的,因为可以打破Golang的类型安全性和内存安全性,使用 unsafe包的程序可能会影响可移植性和兼容性,接下来看下unsafe包中的类型和函数
    2023-08-08
  • golang程序使用alpine编译出最小arm镜像实现

    golang程序使用alpine编译出最小arm镜像实现

    这篇文章主要为大家介绍了golang程序使用alpine编译出最小arm镜像,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 基于Golang 高并发问题的解决方案

    基于Golang 高并发问题的解决方案

    这篇文章主要介绍了Golang 高并发问题的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang并发操作中常见的读写锁详析

    Golang并发操作中常见的读写锁详析

    Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段,这篇文章主要给大家介绍了关于Golang并发操作中常见的读写锁的相关资料,需要的朋友可以参考下
    2021-08-08
  • Windows10系统下安装Go环境详细步骤

    Windows10系统下安装Go环境详细步骤

    Go语言是谷歌推出的一款全新的编程语言,可以在不损失应用程序性能的情况下极大的降低代码的复杂性,这篇文章主要给大家介绍了关于Windows10系统下安装Go环境的详细步骤,需要的朋友可以参考下
    2023-11-11
  • Golang 协程配合管道的实现示例

    Golang 协程配合管道的实现示例

    本文主要介绍了Golang协程配合管道的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Golang中定时器的陷阱详解

    Golang中定时器的陷阱详解

    这篇文章主要给大家介绍了关于Golang中定时器陷阱的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • GoLand如何设置中文

    GoLand如何设置中文

    这篇文章主要介绍了GoLand如何设置中文,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 基于Go和PHP语言实现爬楼梯算法的思路详解

    基于Go和PHP语言实现爬楼梯算法的思路详解

    这篇文章主要介绍了Go和PHP 实现爬楼梯算法,本文通过动态规划和斐波那契数列两种解决思路给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 一文带你轻松学会Go语言动态调用函数

    一文带你轻松学会Go语言动态调用函数

    这篇文章主要是带大家学习一下Go语言是如何动态调用函数的,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考下
    2022-11-11

最新评论