golang 函数选项模式

一 什么是函数选项模式

函数选项模式允许你使用接受零个或多个函数作为参数的可变构造函数来构建复杂结构。我们将这些函数称为选项,由此得名函数选项模式。

例子:

有业务实体Animal结构体,构造函数NewAnimal();

type Animal struct {Name   string
}func NewAnimal(name string) *Animal {return &Animal{Name:   name,}
}a1 := NewAnimal("兔")

后面由于业务改动,需要Animal新增一个属性Age,这时构造函数NewAnimal就得相应做修改,调用的地方全部都得改,势必会影响现有代码;

type Animal struct {Name   stringAge int
}func NewAnimal(name string,age int) *Animal {return &Animal{Name:   name,Age :age,}
}a1 := NewAnimal("兔",1)

后续逐步加新字段,这个构造函数就会被撑爆了,如果调用的地方越多,很难维护。

二 函数选项模式实现

先定义一个函数类型OptionFunc

type OptionFunc func(*Animal)

根据新结构体字段,定义With开头的函数,返回函数类型为OptionFunc的闭包函数,内部逻辑只需要实现更新对应字段值即可

func WithHeight(name string) OptionFunc {return func(a *Animal) { a.Name = name }
}
func WithAge(age int) OptionFunc {return func(a *Animal) { a.Age = age }
}。。。。

调用优化后的构造函数,快速实现实例的初始化。想要指定哪个字段值,那就调用相应的With开头的函数,完全做到可配置化、可插拔;不指定还支持了默认值

func NewAnimal(name string, opts ...OptionFunc) *Animal {a := &Animal{Name: name, Age: 4}for _, opt := range opts {opt(a)}return a
}

三 总结

函数选项模式的好处:

  • 直觉式的编程
  • 高度的可配置化
  • 很容易维护和扩展
  • 自文档
  • 对于新来的人很容易上手
  • 没有什么令人困惑的事(是nil 还是空)

参考:
icon-default.png?t=N7T8https://coolshell.cn/articles/21146.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【超全】React学习笔记 上:基础使用与脚手架

React学习笔记 React系列笔记学习 中篇笔记地址:【超全】React学习笔记 中:进阶语法与原理机制 下篇笔记地址:【超全】React学习笔记 下:路由与Redux状态管理 React 简介 React 是一个由 Facebook 开发并维护的用于构建用户界面的…

C++的一些基础

1、reinterpret_cast reinterpret_cast是四种强制转换中功能最为强大的(最暴力,最底层,最不安全)。它的本质是编译器的指令。 它的作用:它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。…

网络运维与网络安全 学习笔记2023.12.2

网络运维与网络安全 学习笔记 第三十三天 今日目标 Linux系统综述、部署本地Linux、配置Linux网络 SSH远程控制、远程文档管理、选购ECS云主机 Linux系统综述 Linux是一种操作系统 Linux之父,Linus Torwalds 1991年10月,发布0.02版(第一…

Redis集群详解

1.1 什么是Redis集群 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务,提高整体性能和可靠性。根据搭建的方式和集群的特性,Redis集群主要有三种模式:主从复制…

海林猴头菇 区域公用品牌形象正式发布

猴头菇是中国八大“山珍”之一,自古就有“山珍猴头,海味燕窝”之说,猴头菇在中国既是食用珍品,又是重要的药用菌。 海林市位于黑龙江省东南部,地处长白山脉张广才岭东麓,素有“林海雪原”之称。 海林猴头菇…

zookeeper集群+kaafka集群

kafka3.0之前依赖于zookeeper zookeeper开源,分布式的架构,提供协调服务(Apache项目) 基于观察者模式涉及的分布式服务管理架构 存储和管理数据,分布式节点上的服务接受观察者的注册,一旦分布式节点上的…

计算机网络TCP篇②

一、TCP 重传、滑动窗口、流量控制、拥塞控制 1.1、重传机制 在 TCP 中,当发送端的数据达到接受主机时,接收端主机会返回一个确认应答消息,表示已收到消息。但是在复杂的网络中,并一定能顺利正常的进行数据传输,&…

Linux 匿名页反向映射

1. 何为反向映射 正向映射: 用户进程在申请内存时,内核并不会立刻给其分配物理内存,而是先为其分配一段虚拟地址空间,当进程访问该虚拟地址空间时,触发page fault异常,异常处理流程中会为其分配物理页面&am…

关于Typora如何插入自己的云端视频的方法

关于Typora如何插入自己的云端视频的方法 文章目录 关于Typora如何插入自己的云端视频的方法前言:实现步骤:小结 前言: 我本来使用gitee来作为typora的图床,但我现在想要把我自己的视频上传到云端,然后通过超链接在ty…

【力扣1929】数组串联

【力扣1929】数组串联 一.题目描述 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums…

Go 语言真正有什么用处?

在其十几年的发展过程中&#xff0c;Google 的Go 编程语言已经从 alpha 极客的好奇心发展成为世界上一些最重要的云原生软件项目背后经过考验的编程语言。 为什么Docker、Kubernetes等项目的开发者会选择 Go &#xff1f;Go 的定义特征是什么&#xff1f;它与其他编程语言有何…

215. 数组中的第K个最大元素

题目&#xff1a; 解法一、优先级队列 代码 #include<queue> class Solution { public:int findKthLargest(vector<int>& nums, int k){//使用优先级队列直接秒杀&#xff01;priority_queue<int ,vector<int>,less<int>> q;for(int i0;i&…

HttpClient

HttpClient作用&#xff1a; 发送HTTP请求 接收响应数据 HttpClient应用场景&#xff1a; 使用扫描支付、查看地图、获取验证码、查看天气等功能,需要发起请求的时候 实现HttpClient HttpClient的maven坐标&#xff1a; <dependency><groupId>org.apache.httpco…

链表数组插入排序

InsertSort 插入排序算法&#xff0c;比如打扑克牌的算法时&#xff0c;按照从左到右&#xff0c;找到对应的位置插入排序 最重要的是位置移动 找到对应位置值 #include "iostream" #include "bits/stdc.h"using namespace std;void sort(vector<in…

关于微信公众号授权的几件事

背景 项目需要使用微信公众号发消息&#xff0c;然后就来接入这个微信授权啦&#xff0c;微信公众号发消息前提是还需要用户先关注公众号~ 微信授权是有点恶心的&#xff0c;真的真的需要先配置好环境&#xff0c;开发的话目前是可以使用测试号申请公众号使用测试号的appid~ …

【云备份】业务处理

文章目录 1. 业务处理作用功能 2. 代码框架编写构造函数UpLoad ——文件上传请求ListShow —— 展示页面请求处理实现Download —— 下载请求的处理实现断点续传实现 1. 业务处理 作用 业务处理模块是对客户端的业务请求进行处理 功能 1.文件上传请求&#xff1a;备份客户端…

lv11 嵌入式开发 中断处理 15

前言&#xff1a;中断属于7种异常的1种&#xff0c;这节主要讲CPU接收到中断之后怎么处理&#xff0c;回顾之前的知识。 目录 1 异常 1.1 概念 1.2 异常处理机制 1.3 ARM异常源 1.4 异常模式 1.5 ARM异常响应 1.6 异常向量表 1.7 异常返回 ​编辑 1.8 IRQ异常举例 …

git 中的stash和alias的应用

1.Stash的应用 暂存当前修改&#xff1a; git stash save "message"&#xff1a;将当前修改保存到一个新的 stash 中&#xff0c;并可以为这个 stash 添加一条描述信息。 查看已保存的 stash 列表&#xff1a; git stash list&#xff1a;列出所有已保存的 stash…

scrapyd及gerapy的使用及docker-compse部署

一、scrapyd的介绍 scrapyd是一个用于部署和运行scrapy爬虫的程序&#xff0c;它允许你通过JSON API(也即是web api)来部署爬虫项目和控制爬虫运行&#xff0c;scrapyd是一个守护进程&#xff0c;监听爬虫的运行和请求&#xff0c;然后启动进程来执行它们 scrapyd的安装 scr…

从“芯”到云,看亚马逊云科技如何让未来“平等”发生

文章目录 业界最全面算力选择&#xff0c;有效解决多样性需求多年自研芯片积累&#xff0c;带来性能与性价比双重优势全球基础设施与独特的业务模式&#xff0c;让创新不受限 “科幻作家威廉吉布森说‘未来已至&#xff0c;只是还没有均匀分布’。”2023年6月底&#xff0c;当亚…