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.hqwc.cn/news/235452.html

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

相关文章

Microsoft Remote Desktop高效、安全、稳定的远程办公解决方案

在今天的数字化时代,Remote Desktop远程办公已成为许多人的日常生活。无论你是因为工作需要,还是因为在家中需要访问公司服务器,微软远程连接软件都是一个理想的选择。 微软远程连接软件Remote Desktop是一款高效、安全、稳定的远程办公解决…

道路病害检测数据集RDD2022的标签映射关系【参考自官网给出的label_map.pbtxt文件,附查看代码】

TOC 结论 Label ID: 1, Label Name: D00 Label ID: 2, Label Name: D10 Label ID: 3, Label Name: D20 Label ID: 4, Label Name: D40链接地址 https://github.com/sekilab/RoadDamageDetector/ 查看代码 # 打开 label_map.pbtxt 文件 def read_label_map(file_path):label…

【LeetCode:1670. 设计前中后队列 | 数据结构设计】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

ESP32-Web-Server编程- 通过文本框向 Web 提交数据

ESP32-Web-Server编程- 通过文本框向 Web 提交数据 概述 前述章节我们通过简单 HTML、AJAX、Websocket、SSE 在网页上显示数据,通过网页上的按钮控制 ESP32 的行为。从本节开始,我们将进一步了解通过网页与 ESP32 进行交互的方法。 实现更复杂的交互功…

Trie字典树

文章目录 什么是 T r i e Trie Trie 树一般条件 AcWing 835. Trie字符串统计CODE解释一下 i n s e r t ( ) insert() insert() 函数 i d x idx idx 的意义 AcWing 143. 最大异或对异或思路解析CODE代码解析 给点思考 什么是 T r i e Trie Trie 树 一种树结构,用…

NX二次开发UF_MTX2_vec_multiply_t 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_vec_multiply_t Defined in: uf_mtx.h void UF_MTX2_vec_multiply_t(const double vec [ 2 ] , const double mtx [ 4 ] , double vec_product [ 2 ] ) overview 概述 Ret…

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

你是否曾想过,元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的?在本期的《开箱元宇宙》 系列中,我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列,以及是什么原…

软考:2024年软考高级:软件工程

软考:2024年软考高级: 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1…

进程间的信号

1. 进程信号 1.1 进程信号的概念 信号是一个软件中断,通知进程某个事件发生了异步事件,打断进程当前的操作,去处理这个事件,信号是多种多样的,并且一个信号对应一个事件,这样才能做到进程收到一个信号后&…

解决:ValueError: the first two maketrans arguments must have equal length

解决:ValueError: the first two maketrans arguments must have equal length 文章目录 解决:ValueError: the first two maketrans arguments must have equal length背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在…

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后,后端总是会遇到这个问题,设备通道在访问数据库时经常会报错,在搜集大量资料后我以为是配置问题,首先要保证: (1)首先确定jdbc.url地址是正确的 (2&#xf…

【C++】类和对象——const修饰成员函数和取地址操作符重载

在上篇博客中,我们已经对于日期类有了较为全面的实现,但是,还有一个问题,比如说,我给一个const修饰的日期类的对象 这个对象是不能调用我们上篇博客写的函数的,因为&d1是const Date*类型的&#xff…