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   string
   Age 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【opencv】计算机视觉基础知识

目录 前言 1、什么是计算机视觉 2、图片处理基础操作 2.1 图片处理:读入图像 2.2 图片处理:显示图像 2.3 图片处理:图像保存 3、图像处理入门基础 3.1 图像成像原理介绍 3.2 图像分类 3.2.1 二值图像 3.2.2灰度图像 3.2.3彩色图像…

Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画

最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏,实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。 DOTS 对角色动画支持的局限性 截止到Unity DOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS 的b…

iOS系统上待办事项提醒软件哪个好

在这个快节奏的生活中,各种待办事项充斥了我们的日常工作和生活,尤其对于像我这样的iPhone用户而言,一款能够在iOS系统上快速和准确记录和提醒待办事项的软件,显得至关重要。 正如前几天,我正沉浸在工作中的时突然被领…

采购流程的简要概述

外部采购流程 一般来讲,企业的采购业务一般是对外采购活动,一个比较典型采购业务循环通常包括:需求提报、货源确定和供应商选择、采购订单处理、采购订单状态跟踪监控、到厂收货、发票校验、付款。 以下对几个节点进行详细的解释&#xff…

亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试

近日,在中国信通院“可信数据库”数据库迁移工具专项测试中,湖南亚信安慧科技有限公司(简称:亚信安慧科技)数据库数据同步平台V2.1产品依据《数据库迁移工具能力要求》、结合亚信科技AntDB分布式关系型数据库产品&…

JavaScript添加快捷键、取消浏览器默认的快捷操作、js查看键盘按钮keycode值

document.addEventListener("keydown",function (event) {// 如果不知道按键对应的数字(keyCode)是多少可以弹出查看一下// alert(event.keyCode)if (event.ctrlKey && event.altKey && event.view["0"] null){if(…

苹果手机格式化后数据还能恢复吗?本文将解答您的疑惑!

手机已经成为我们生活中不可或缺的一部分。然而,有时候我们会因为一些原因对手机进行格式化,从而造成数据的丢失。那么,手机格式化后数据还能恢复吗?本文将为大家详细解答这一问题,感兴趣的小伙伴请接着往下看&#xf…

java 对象大小计算

说明: 对于64位机:一个对象由三部分组成 对象头(object header) mark word :64bitkclass pointer :32bit(默认使用指针压缩),如果取消指针压缩( XX:-UseCompressedOops),则占用64bit数组长度:数…

38 - MySQL中InnoDB的知识点

InnoDB 存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 1、InnoDB 体系架构 InnoDB 主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包括缓存磁…

WordPress(10)解决中文连接问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、修改的前后二、自定义结构讲明三、修改方法前言 提示:这里可以添加本文要记录的大概内容: 1.中文连接如:http://www.lplovemm.love/2023/11/12/测试 2.这种连接在提交sitemap收录的时…

R语言30分钟上手

文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…

帆软的控件参数-笔记1

1.帆软的控件参数 变量可以通过模板->模板参数定义添加需要给变量赋值的控件,如下拉控件时,将控件名称命名为与模板参数同名帆软就会自行匹配。也可以不添加模板参数,直接给控件名称命名,该命名就是变量名,该变量名…

淘天集团筹建大模型团队;最懂程序员的AI搜索引擎;奇绩创坛2023秋季路演;OpenAI大佬这么搞定机器学习;金融业大模型应用报告 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 👀 淘天集团正在筹建大模型团队,已开启招聘 据悉,淘天集团正在筹建大模型研究团队,并将主要围绕「搜广…

基于单片机的电子密码锁设计

1.设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的电子密码锁,可设置四位密码,输入错误三次,报警灯亮起(红灯亮起),输入正确,绿灯闪烁三次。可通过LCD显示屏查看密码&…

ResizeObserver loop limit exceeded报错解决方案

前言: 控制台没有报错,但是开发Vue项目过程中一直报ResizeObserver loop limit exceeded 错,找到以下解决方式。在main.js文件中重写 ResizeObserver 方法。 main.js文件 (完整版) import { createApp } from "v…

C/C++不定参数的使用

文章目录 C语言的不定参C的不定参 C语言的不定参 C语言的不定参数最常见的应用示例就是printf函数&#xff0c;如下&#xff0c;参数列表中的...表示不定参数列表 #include <stdio.h> int printf(const char *format, ...);试着模拟实现C语言的printf函数 void myprin…

【Android】MotionLayout实现动画

MotionLayout不断地更新&#xff0c;文章并不适用全部最近的更新内容。 文章目录 引入 ConstraintSetTransitionManager和MotionLayout有什么区别&#xff1f; 使用ConstrainSet(属性类似于ConstrainLayout) Transition属性OnClickOnSwipeKeyFrameSetKeyPositionKeyAttribute C…

会泽一村民上山放羊吸烟引发森林火灾,AI科技急需关注

2023年4月&#xff0c;会泽县古城街道厂沟村委会望香台山林中发生了一场由疏忽引发的森林火灾。张某某在放羊时未完全熄灭烟头&#xff0c;导致7.33公顷的林地和草地被焚毁&#xff0c;直接经济损失高达29.097万元。这一事件再次凸显了日常生活中的安全隐患。 在这一背景下&…

双通道 H 桥 5V 4A驱动芯片

SS6951A 为电机一体化应用提供一种双通道集成电机驱动方案。SS6951A 有两路 H 桥驱动&#xff0c;每个 H 桥可提供最大峰值电流 4.0A&#xff0c;可驱动两个刷式直流电机&#xff0c;或者一个双极步进电机&#xff0c;或者螺线管或者其它感性负载。双极步进电机可以以整步、2 细…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于分布鲁棒优化的广义共享储能容量配置方法》

这个标题涉及到储能系统的容量配置方法&#xff0c;具体而言&#xff0c;是一种基于分布鲁棒优化的广义共享储能容量配置方法。让我们逐步解读&#xff1a; 基于分布鲁棒优化&#xff1a; 这表明该方法采用了一种优化技术&#xff0c;即分布鲁棒优化。分布鲁棒优化通常是指在考…