返回顶部
首页 > 资讯 > 后端开发 > GO >GO 函数式选项模式(Functional Options Pattern)
  • 179
分享到

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

2024-04-02 19:04:59 179人浏览 八月长安
摘要

golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的

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 函数式选项模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GO 函数式选项模式(Functional Options Pattern)

本文链接: https://lsjlt.com/news/154605.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • GO 函数式选项模式(Functional Options Pattern)
    Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的...
    99+
    2024-04-02
  • 详解Golang函数式选项(Functional Options)模式
    概览 最近阅读源码的时候看到一段不错的代码,但是当时却不是非常理解为什么这么写。 我们先来看一下源代码: type User struct { ID string N...
    99+
    2024-04-02
  • ASP.NETCore中的Options选项模式
    1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸。在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定...
    99+
    2024-04-02
  • Golang函数式选项模式怎么实现
    本篇内容主要讲解“Golang函数式选项模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang函数式选项模式怎么实现”吧!概览最近阅读源码的时候看到一段不错的代码,但是当时却不是...
    99+
    2023-06-22
  • ASP.NET Core中的Options选项模式怎么配置
    这篇文章主要介绍“ASP.NET Core中的Options选项模式怎么配置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core中的Options选项模式怎么配...
    99+
    2023-06-29
  • Keras函数式(functional)API的使用方式
    目录多层感知器(Multilayer Perceptron)卷积神经网络(Convolutional Neural Network)循环神经网络(Recurrent Neural N...
    99+
    2023-02-22
    Keras函数式 Keras functional API Keras functional
  • Go|使用Options模式和建造者模式创建对象实战
    目录复杂对象的问题Options 模式建造者模式总结复杂对象的问题 在 Golang 中一般创建复杂对象,一般会使用2种方式创建对象:Options 模式(函数式选项模式)和建造者...
    99+
    2023-05-16
    Go Options创建对象 Go Options建造者模式
  • ts 类型体操 Chainable Options 可链式选项示例详解
    目录问题答案传参option部分get问题 在JavaScript我们通常会使用到可串联(Chainable/Pipline)的函数构造一个对象,但是在Typescript中,你能合...
    99+
    2024-04-02
  • PHP 函数式编程与设计模式
    函数式编程采用不可变值和函数应用,可提高代码稳定性。结合设计模式,它创造了高效且易于维护的应用程序。例如,策略模式使用映射函数来选择算法,我们演示了使用冒泡排序和快速排序策略对数组进行排...
    99+
    2024-05-06
    php 函数式编程 冒泡排序
  • Golang函数错误处理的模式与反模式
    go 函数错误处理模式有:使用 errors.new() 创建错误、包装底层错误、返回 nil 表示无错误。反模式包括:使用魔数或字符串表示错误、隐式处理错误、忽略错误、延迟退出模式。最...
    99+
    2024-04-24
    golang 函数错误处理
  • Go语言函数参数传递的方式及注意事项
    Go语言是一种由谷歌开发的开源编程语言,以其性能优异和简洁易读的特点而备受开发者青睐。在Go语言中,函数参数的传递方式对于编写高效、可维护的代码至关重要。本文将探讨Go语言中函数参数传...
    99+
    2024-04-02
  • phthon中的open函数模式
    原文地址:http://www.runoob.com/python/python-func-open.html   r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文...
    99+
    2023-01-30
    函数 模式 phthon
  • Go函数性能优化:缓存利用与设计模式
    go函数性能优化可通过缓存和设计模式实现。缓存使用sync.map存储频繁访问数据,提高性能。备忘录模式缓存函数调用结果,避免重复计算。建造者模式分步创建复杂对象,避免创建不需要的对象。...
    99+
    2024-05-04
    go 性能优化 键值对
  • C++ 函数异常与设计模式:模式化异常处理
    在 c++++ 中,异常处理设计模式是创建可重用且可靠代码的有效方法,其中包括异常处理模式。本文探讨了以下常用模式:异常安全:确保异常不会破坏函数内部状态。访问器保护:确保访问成员变量时...
    99+
    2024-05-03
    c++ 异常
  • 分布式系统中的 Golang 函数部署模式
    在分布式系统中部署 golang 函数,可采用两种模式:容器镜像:将函数代码打包成容器镜像,提供灵活性但管理容器较复杂。source:直接部署函数源代码,简单易用但可移植性受平台支持限制...
    99+
    2024-04-19
    golang 分布式系统
  • win7休眠模式选项不见了如何找回
    这篇文章主要介绍“win7休眠模式选项不见了如何找回”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win7休眠模式选项不见了如何找回”文章能帮助大家解决问题。方法:我们依次打开控制面板→硬件和声音→...
    99+
    2023-06-28
  • Vue选项之propsData传递数据方式
    目录Vue选项propsData进行传递数据Vue.extend全局扩展的数据传递propsDataVue选项 propsData进行传递数据 使用全局扩展器时可以利用propsDa...
    99+
    2022-11-13
    Vue选项 propsData传递数据 Vue propsData传递数据
  • python(3)模块、函数式 、三元运
    一、模块和模块的常用方法__name__判断是否为主文件>>> print __name__   #判断是否是主文件,如果是主文件就返回_main_ __main____file__返回当前.py文件的路径cat /roo...
    99+
    2023-01-31
    函数 模块 python
  • golang函数的通用设计模式
    go 语言函数设计模式用于提高代码可读性、可维护性和可重用性,包括:输入/输出参数:允许函数通过参数修改调用方的值。返回多个值:简化代码,避免使用全局变量。函数作为参数:创建灵活、可定制...
    99+
    2024-04-26
    golang 设计模式 代码可读性
  • golang函数的错误处理模式
    在 go 中处理函数错误的常见模式有:返回错误:函数返回错误值,成功时为 nil,失败时为 error 类型。全局变量:使用全局变量存储错误值,以便函数轻松访问和使用错误值。恐慌:当错误...
    99+
    2024-05-04
    golang 错误处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作