golang构造函数的最佳实践-FOP模式

简介: golang构造函数的最佳实践-FOP模式

今年活下去就是最好的岁月静好


1. 前言



golang构造函数的初始化相信大家信手拈来,但是如果写出可扩展的,向后兼容且容易维护的构造函数,那是相当不容易的。那么这篇文章我将带领大家学习这项新的技能。


2. 不好的写法



type Student struct {
 Name string
}
func NewStudent(name string) *Student {
 return &Student{
  Name: name,
 }
}


可以看到当有一个属性name的时候构造函数挺简单的,但是后面需求变更了,要增加一个age属性,那么这个时候你就得修改Student结构体和构造函数,这样非常不利于扩展和维护,那么怎么解决呢?



3. 函数选项模式彻底搞定它



懂得人都懂,不懂的人会懂,接下来开始炫技了,请大家带上瓜子和板凳静听我娓娓道来。闲话不多说,直接上干货:


type Student struct {
    Name string
    Age int
}
//定义类型函数
type StudentOption func(*Student)
//创建带有age的构造函数
func WithAge(age int) StudentOption{
    return func(s *Student){
        s.Age = age
    }
}
//创建带有默认值的构造函数 
func NewStudent(name string, options ...StudentOption) *Student{
    student := &Student{Name:name, Age:5}
    for _,o :=range options{
        o(student)
    }
    return student
}

看到了吗,我滴个乖乖,如此优雅的写法第一次见,那照这么说当我增加第三个属性sex的时候,那就再写一个WithSex就行了,不会改动之前已有的逻辑,这样当我实例化的时候NewStudent(“lisi”, WithAge(6),WithSex("男"))就行了,这样很方便不是吗,是的,我现在很明确告诉你非常方便。


4. 小结



Functional Options Pattern(简称FOP模式)这种函数选项模式既保持了兼容性,而且每增加1个新属性只需要1个With函数即可,大大减少了修改代码的风险,所以这种秀操作为什么还不在项目中实践呢?


5. 关注公众号



 微信公众号:堆栈future



相关文章
|
设计模式 Go 开发工具
Golang设计模式——12中介模式
Golang设计模式——12中介模式
99 0
|
物联网 Go 网络性能优化
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
1048 1
|
Go 数据安全/隐私保护
Golang 里的 AES、DES、3DES 加解密,支持 ECB、CBC 等多种模式组合
Openssl encryption 是 OpenSSL 库的功能包装,支持对称加密算法(AES、DES、3DES)的 ECB 和 CBC 模式。提供简便的 Go 语言接口,用于加密和解密操作。安装命令:`go get -u github.com/forgoer/openssl`。示例代码展示了 AES-ECB、AES-CBC 等模式的使用方法,支持 PKCS7 填充。
366 102
|
12月前
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
294 0
|
存储 程序员 编译器
Golang 中的字符串:常见错误和最佳实践
Golang 中的字符串:常见错误和最佳实践
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
867 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
中间件 测试技术 Go
Golang中的错误处理最佳实践
【7月更文挑战第10天】在Golang中,错误处理是核心且重要的。最佳实践包括:定义明确的错误类型,使用错误链(如`%w`包装错误),始终检查错误(避免忽略),谨慎使用`panic`和`recover`,利用多值返回处理错误,标准化错误处理逻辑,并确保测试错误处理代码。这些做法有助于构建健壮和可维护的程序。
|
测试技术 Go
golang 的重试弹性模式
Golang 中的重试机制实现了一个名为 `Retrier` 的结构体,用于实现弹性模式。`Retrier` 创建时需要指定重试间隔(如常量间隔或指数递增间隔)和错误分类器。分类器决定了哪些错误应被重试。默认情况下,如果未提供分类器,则使用默认分类器,它简单地将非 nil 错误标记为应重试。提供了三种分类器:默认、白名单和黑名单。`Run` 和 `RunCtx` 是执行重试的函数,后者接受上下文以便处理超时。通过 `calcSleep` 计算带有随机抖动的休眠时间,增加重试的不可预测性,减少并发冲突。如果达到最大重试次数或上下文超时,重试将停止。
191 1
|
测试技术 Go
golang 的重试弹性模式怎么设计?
Golang的可重构弹性模式通过`Retrier`实现了重试逻辑。创建`Retrier`需指定重试间隔(隐含重试次数)及错误分类器,决定哪些错误需重试。示例代码展示了如何创建一个重试器并执行带有重试逻辑的工作函数。`Retrier`结构体包含重试间隔、分类器等字段。
143 0
|
设计模式 Go 调度
Golang深入浅出之-Go语言中的并发模式:Pipeline、Worker Pool等
【5月更文挑战第1天】Go语言并发模拟能力强大,Pipeline和Worker Pool是常用设计模式。Pipeline通过多阶段处理实现高效并行,常见问题包括数据竞争和死锁,可借助通道和`select`避免。Worker Pool控制并发数,防止资源消耗,需注意任务分配不均和goroutine泄露,使用缓冲通道和`sync.WaitGroup`解决。理解和实践这些模式是提升Go并发性能的关键。
264 2

推荐镜像

更多